我打算在数据库中找到包含一些字符串的所有代码。我运行一个查询,如:
SELECT DISTINCT name, type FROM all_source WHERE UPPER(text) LIKE UPPER(‘%string%’);很多结果,比如100个结果,在类型列中包含了“PACKAGE”。由于包主体太大,我只想获得包含该文本的过程/函数的名称。
因此,我添加以下子句
AND TYPE IN ('PROCEDURE', 'FUNCTION')现在我只得到了几个结果,比如说10个结果,我很困惑。
既然包体只能包含函数和过程(除了包常量外),如果100个包包含文本'abc',那么只有10个过程可以包含相同的文本吗?文本'abc‘使用一个包只能适合于一个过程或一个函数,所以如果有100个出现的使用包,必须至少有100个发生在功能/过程中。
我需要对这种现象做一些解释,更重要的是,我想知道如何缩小文本搜索范围,以获得包含过程/函数的名称,而不是父包?
(有同事建议,有些程序只是进口,而不是汇编;这是否一个原因?)
发布于 2019-04-08 16:47:33
你的搜索必须更加复杂。存储的代码可以放在包标头中,而这并不是经常执行的。大多数情况下,它是在包体。如果您修改了查询以读取
SELECT DISTINCT name, type FROM all_source WHERE UPPER(text)
LIKE UPPER(‘%string%’) and type ='PACKAGE BODY';这给出了在包体中符合标准的所有代码。行号是您在全_来源中所能得到的全部信息。all_source中可用的字段为
OWNER VARCHAR2(30) Owner of the object
NAME VARCHAR2(30) Name of the object
TYPE VARCHAR2(12) Type of object: FUNCTION, JAVA SOURCE, PACKAGE,PACKAGE BODY, PROCEDURE, TRIGGER, TYPE, TYPE BODY
LINE NUMBER Line number of this line of source
TEXT VARCHAR2(4000) Text source of the stored object 当您搜索类型、过程或函数时,您将看到不属于包的独立代码块。
如果编码风格包括包体中的过程或函数中的本地过程或函数,则会很快变得复杂。您可以查找代码块之前的强制语法:过程xxx或函数xx is,以及结束它的代码;
所以你的搜索应该是:
或者您可以使用GUI工具,比如TOAD或,它将为您完成此任务。
https://dba.stackexchange.com/questions/234211
复制相似问题