【问题标题】:Can DBMS_METADATA.GET_DDL procedure correct poor indentation?DBMS_METADATA.GET_DDL 过程可以纠正不良缩进吗?
【发布时间】:2021-05-03 19:07:54
【问题描述】:

以下是获取 DDL 或过程并使其漂亮的命令:

EXEC DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM , 'PRETTY' , TRUE);
SELECT DBMS_METADATA.GET_DDL('PROCEDURE', UPPER('LOOPPROC'), 'MYSCHEMA') FROM DUAL;

这是与输入完全相同的输出,就像上面将 PRETTY 设置为 FALSE 一样。

  CREATE OR REPLACE EDITIONABLE PROCEDURE "MYLANID"."LOOPPROC" (inval NUMBER) 

IS

  tmpvar   NUMBER;
  tmpvar2   NUMBER;
  total     NUMBER;

BEGIN

  tmpvar := 0;
  tmpvar2 := 0;
  total := 0;

  FOR lcv IN 1 .. inval

  LOOP

      total := 2 * total + 1 - tmpvar2;
      tmpvar2 := tmpvar;
      tmpvar := total;

  END LOOP;

  IF inval = 1 THEN
                        DBMS_OUTPUT.put_line ('IN IF TRUE branch, inval = ' || inval);
DBMS_OUTPUT.put_line ('IN IF TRUE branch, inval is still = ' || inval);
  ELSE
     DBMS_OUTPUT.put_line ('IN ELSE, inval = ' || inval);
  END IF;
   

  DBMS_OUTPUT.put_line ('TOTAL IS: ' || total);

END loopproc;

注意 IF - THE - ELSE 子句如何像 Snake River 一样缩进。

有没有办法让程序更常规地缩进?

【问题讨论】:

    标签: oracle schema


    【解决方案1】:

    我也对可以从 .net 调用的开源开放。我正在考虑作为最后的手段使用 Selenium 来利用执行 sql 格式的免费网站,但只是作为最后的手段。

    想法:SQL Developer 已经内置了formatting capabilities 并允许设置多个选项。

    然后使用:Command-Line Interface for SQL Developer:

    对于某些操作,您可以从命令行调用 SQL Developer 作为图形用户界面的替代方法。使用命令行界面,进入SQL Developer安装位置下的sqldeveloper\sqldeveloper\bin文件夹或sqldeveloper/sqldeveloper/bin目录,输入sdcli。

    C:\sqldeveloper\sqldeveloper\bin>sdcli
    

    可用功能:

    格式:格式化任务

    调用:

     sdcli format input=<here goes file>
    

    我可以想象构建以下批处理脚本/管道:

    1. 从 Oracle 获取对象定义
    2. 另存为文件
    3. 使用sdcli format
    4. 回读文件内容

    【讨论】:

    • Lukasz,这看起来很有效,适合我的目的。我怀疑它可能比让数据库执行格式要慢,我有点失望(在 Oracle 中)PRETTY 选项似乎不起作用,但我很高兴你指出了这个功能。谢谢你,先生!
    • 虽然有效,但速度非常慢。格式化一个1200行的包大约需要20秒。
    • @Chad 20s 对于一个文件来说是相当多的,特别是如果它必须是 CI 管道的一部分。我猜这是因为启动 SQL Developer 的开销。也许通过提供input=folder 或通过两个文件夹input=folder1 output=folder2 一次执行所有文件会更快
    • 谢谢 Lukasz,我正计划尝试同样的事情,但是当 IU 看到你的帖子时,试了一下。对于大量文件,性能非常好。问题是我开发了一个 UI,允许用户查询 db 对象,获取每个测试和产品环境的 DDL(大约有 7 个环境),然后格式化和比较 DDL。在 7 个环境中。获取 DDL 非常快,但等待 20 秒让 SQL Discover 启动完成它的工作对于 UI 事务来说非常慢,如果不需要格式化,则立即执行。 (我在单独的线程上获得所有环境的 DDL)
    猜你喜欢
    • 1970-01-01
    • 2016-05-29
    • 2016-01-30
    • 2020-01-31
    • 2019-09-05
    • 2014-04-25
    • 2017-06-12
    • 1970-01-01
    • 2021-08-01
    相关资源
    最近更新 更多