假设我有一个PK列的给定值:
10
是否有查询来查找与该特定pk值有关系的所有表?
单列PK的示例。PK约束名称可以从DBA_CONSTRAINTS(USER_CONSTRAINTS、ALL_CONTRAINTS)派生。该代码可以使用PK值的集合扩展到多列PK
declare
p_pk_name varchar2(30):= '<PK constraint_name>';
p_pk_value varchar2(500):='<PK value>';
l_cnt int;
begin
for x in
(
select t.owner, t.table_name, cc.column_name
from dba_constraints c,
dba_tables t,
dba_cons_columns cc
where c.r_constraint_name = p_pk_name
and t.owner = c.owner
and t.table_name = c.table_name
and cc.owner = c.owner
and cc.constraint_name = c.constraint_name
)
loop
execute immediate 'select count(1) from '||x.owner||'.'||x.table_name|| ' where '||x.column_name||' = :p_pk_value and rownum <= 1' into l_cnt using p_pk_value ;
if l_cnt <> 0 then
dbms_output.put_line(x.owner||'.'||x.table_name);
end if;
end loop;
end;
不是一个查询,但您可以编写一个PL/SQL块来完成它。您可以从USER_CONSTRAINTS(或ALL_CONSTRAINTS或DBA_CONSTRAINTS)上的查询开始,查找具有引用给定主键的外键的表。对于每一个,您都要创建并执行一个动态SQL查询,看看是否有任何行具有您感兴趣的特定PK值
使其适用于多列键将是一个额外的挑战。
以下是它在SQL Server中的样子:
DECLARE @keyColumn VARCHAR(100)
DECLARE @keyValue INT
SET @keyColumn = 'SiteID'
SET @keyValue = 400
SELECT 'SELECT ''' + TABLE_NAME + ''' AS TABLENAME, "' + @keyColumn
+ '" FROM "' + TABLE_NAME + '" WHERE "' + @keyColumn + '" = '
+ CONVERT(VARCHAR(100), @keyValue) + ' UNION ALL'
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KCU
WHERE KCU.COLUMN_NAME = @keyColumn
我知道Oracle有INFORMATION_SCHEMA
,所以类似的东西应该可以工作。我尝试使用SQLFiddle对其进行调整,但失败了。也许这里的其他人可以编辑我的答案,使其与Oracle配合使用。
以下是生成的SQL的部分内容:
SELECT 'StockInventory' AS TABLENAME, "SiteID" FROM "StockInventory" WHERE "SiteID" = 400 UNION ALL
SELECT 'SiteDomains' AS TABLENAME, "SiteID" FROM "SiteDomains" WHERE "SiteID" = 400 UNION ALL