gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:20:23 24 4
gpt4 key购买 nike

我在做什么:

我对 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com