Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
oracle如何在过程/包中找到begin的行号_Oracle_Stored Procedures_Plsql_Oracle11g - Fatal编程技术网

oracle如何在过程/包中找到begin的行号

oracle如何在过程/包中找到begin的行号,oracle,stored-procedures,plsql,oracle11g,Oracle,Stored Procedures,Plsql,Oracle11g,我想在每个过程、函数和打包的过程中添加一些代码,我有数千个过程、包等,因此手动完成这项工作需要很多周的时间 我可以搜索所有源代码,但在我编写自己的代码之前,是否有人有任何分析代码来查找“开始”的行号,因为我可能需要忽略子例程或匿名块 例如来自用户来源 package body my_pck is procedure proc1 is v_var varchar2(10); procedure sub_proc is begin some co

我想在每个过程、函数和打包的过程中添加一些代码,我有数千个过程、包等,因此手动完成这项工作需要很多周的时间

我可以搜索所有源代码,但在我编写自己的代码之前,是否有人有任何分析代码来查找“开始”的行号,因为我可能需要忽略子例程或匿名块

例如来自用户来源

package body my_pck is
  procedure proc1 
  is
    v_var varchar2(10);
    procedure sub_proc
    is
    begin
      some code ....
    end;
  begin
< I want to insert code here>
    some code ....

    begin
      anon block ....
    end;
  end;
  procedure proc2 
  is
    v_var varchar2(10);
    procedure sub_proc_something_else
    is
    begin
      some code ....
    end;
    procedure sub_proc_another
    is
    begin
      some code ....
    end;
  begin
< I want to insert code here as well>
    some code ....
  end;
end;
包体我的pck是
程序程序1
是
v_var varchar2(10);
程序子程序
是
开始
一些代码。。。。
终止
开始
<我想在这里插入代码>
一些代码。。。。
开始
安侬街区。。。。
终止
终止
程序程序2
是
v_var varchar2(10);
程序子程序或其他程序
是
开始
一些代码。。。。
终止
程序子程序
是
开始
一些代码。。。。
终止
开始
<我也想在这里插入代码>
一些代码。。。。
终止
终止
因此,我认为我需要一个例程来匹配开始/结束,以找到在哪里添加代码

谢谢
Robert

使用$$PLSQL\u行。另请参见$$PLSQL\U单元

BEGIN
  DBMS_OUTPUT.PUT_LINE ( $$PLSQL_UNIT || '.' || $$PLSQL_LINE || ': hello ' );
END;
/

我认为这很难(但并非不可能)做到。首先,您需要从数据库中获取包。我有一些代码可以做到这一点:

DECLARE
  package_name user_source.name%type;
  last_package_name user_source.name%type;
  package_body CLOB;
BEGIN
  FOR package_cur IN
  ( SELECT * FROM user_source WHERE type = 'PACKAGE BODY' ORDER BY name, line
  )
  LOOP
    package_name        := package_cur.name;
    IF last_package_name = package_name OR last_package_name IS NULL THEN
      package_body      := package_body || package_cur.text;
    ELSE
      --=======================================================
      -- whole package is now in package_body and can be altered
      --=======================================================
      insert into tmp_table values (package_body);

      -- move to next package
      package_body := package_cur.text;
    END IF;
    last_package_name := package_name;
  END LOOP;
  -- processing very last package
  insert into tmp_table values (package_body);
END;

下一个障碍是,代码可以用各种方式概括,据我所知,整个包可以用一行代码编写。您必须找到一种或另一种方法,首先从包中提取所有过程,然后绑定相应的begin关键字。

您肯定需要一个解析器来完成此任务。我为创建了一个plsql解析器,如果您愿意,可以使用它。它不是一个成熟的解析器,但足够聪明,能够理解plsql代码的结构

从github获取vorax4项目

cd C:\Projects
git clone https://github.com/talek/vorax4
gem install vorax

编写一个简单的ruby代码来处理您的场景:


$LOAD\u路径谢谢,但这取决于手动将其添加到代码中。。。我想把它自动化。。。我应该补充说,我将把源代码提取到一个文本文件中,添加代码行,然后重新编译回数据库。。。。我现在正在编写一个例程来完成这项工作,我只是在完善拥有子例程的逻辑,而不是把我的代码放在那里!我什么时候应该投反对票?每当你遇到一篇极其草率、不费力气的帖子,或者一个答案明显地、甚至可能是危险地不正确时,请使用你的反对票。