sql - 从 Oracle 查询中提取表引用

标签 sql linux oracle bash shell

我在做什么:

我对 Linux 不是很有经验,但我正在将它用于我公司的内部 API。通过 API,我有一个包含 79 个(预计总共 550 个)PL/SQL 语句的数组,我需要为这些语句获取每个语句中引用的每个表。我曾尝试将每个语句缩减为 FROM 和 WHERE 子句之间的文本,但是有些语句在其 SELECT 语句中有引号,并且有大量子查询,因此并不是 FROM 后面的每个项目都是一个表。

问题:

是否有解析器或一系列已知的正则表达式模式可用于解析表引用?我知道这种模式会非常庞大​​,我希望有人已经完成了这项工作,如果是这样,有人知道它的记录在哪里吗?

到目前为止,这是我尝试过的:

#1 This returns the IDs for each profile I need to reference
IDs=(`echo $(APICommand_GetIDs) | jq '.[] | select(.schedule.type!="NOT_SCHEDULED") | .profileId' |sort | uniq`)

#2 Itterate through the IDs and get the sql statement for each ID. Also has a percentage complete counter
profiles=(); i=0; for ID in "${IDs[@]}"; do profiles+=("`echo $(APICommand_GetProfiles) | jq '.sql'`"); let i+=1; status=`expr $i \* 100 / ${#IDs[@]}`; printf "$status \r"; done; printf "$complete \n";

#3 Itterate through each profile to get line between "FROM" and "WHERE"
echo ${profiles[@]} | sed 's/\\r\\n/ /g' | sed 's/\\t/ /g' | sed 's/%//g' | sed 's/  / /g' | sed 's/.*FROM //' | sed 's/WHERE.*//'

然而,#3 以多行形式返回 PL/SQL 语句,这使得解析变得困难。我也很难想出正则表达式模式来只获得正确的表引用。

最佳答案

看起来好像您正在尝试使用操作系统脚本来查找这些依赖项。如果这些是 pl/sql 语句,并且它们在过程、包或函数中,您可以使用表 PUBLIC_DEPENDENCY 来查找对象的所有依赖关系。将此表中的 object_id 链接到 DBA_OBJECTS。

这是一个 SQL 示例,显示了我的包“ROUTINE_PKG”的依赖关系。

WITH cte (owner, object_type, object_name
        , object_id, lvl)
     AS (SELECT owner
              , object_type
              , object_name
              , object_id
              , 1 lvl
           FROM dba_objects
          WHERE owner = 'BRIANL'
            AND object_name = 'ROUTINE_PKG'
         UNION ALL
         SELECT do.owner
              , do.object_type
              , do.object_name
              , do.object_id
              , lvl + 1
           FROM public_dependency pd
                INNER JOIN cte
                    ON pd.referenced_object_id = cte.object_id
                inner join dba_objects  do on do.object_id = pd.object_id where cte.lvl <= 5)
SELECT distinct *
  FROM cte order by lvl, owner, object_name;


OWNER  OBJECT_TYPE  OBJECT_NAME OBJECT_ID LVL  
BRIANL PACKAGE      ROUTINE_PKG 148593     1  
BRIANL PACKAGE BODY ROUTINE_PKG 148594     1  
BRIANL PROCEDURE    ROUTINE3    148590     2  
BRIANL PACKAGE BODY ROUTINE_PKG 148594     2  
BRIANL PROCEDURE    ROUTINE2    148591     3  
BRIANL PROCEDURE    ROUTINE1    148592     4

关于sql - 从 Oracle 查询中提取表引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43986686/

相关文章:

sql - 为什么这个简单的子查询不起作用?

mysql - 如何使用 MySQL 查询两个日期之间的数据?

linux - linux下如何安装SQL*PLUS客户端

python array to sql in 子句

sql - 获取ORACLE中每个数字的最新记录

java - 如何直接读取Oracle数据泵二进制转储文件?

mysql - 内连接没有匹配的列

SQL - 如果值存在于另一个表中,则插入到表中

linux - 如何设置 "something"使用的模块

linux - 动态运行 linux shell 命令