从 all_tab_columns 输出数据
output data from all_tab_columns
我有一个 table 测试,其中包含许多填充列,其值实际上是数据库中某些 table 的列名。我想构建一个查询,其中 returns 所有者,table_name,column_name 用于所有填充列
DROP TABLE TEST;
create table test (cat varchar2(10) , filler_1 varchar2(10), filler_2 varchar2(10));
INSERT INTO TEST
SELECT
'A', 'DOB','BIRTH_DT' FROM DUAL
UNION ALL
SELECT 'B', 'GENDER' ,'T_GENDER' FROM DUAL
UNION ALL
SELECT 'C', 'ACT_ID', 'ACT_NO' FROM DUAL;
COMMIT;
预期输出:
CAT OWNER TABLE_NAME COLUMN_NM
A SCOTT ABC DOB
A SCOTT XXX BIRTH_DT
B HR AAA GENDER
B HR BBB T_GENDER
C SCOTT CCC ACT_ID
C HR DDD ACT_NO
我如何使用 all_tab_columns 实现此目的,因为有许多此类填充列。
谢谢
这是一个使用动态创建视图的脚本选项。那行得通吗?
DECLARE
sql_string VARCHAR2(4000);
CURSOR columns_cur IS
SELECT column_name
FROM all_tab_columns
WHERE table_name = 'TEST'
AND column_name LIKE 'FILLER\_%' ESCAPE '\';
BEGIN
sql_string := 'CREATE OR REPLACE VIEW test_v AS ';
FOR r IN columns_cur LOOP
sql_string := sql_string||' SELECT cat, '||r.column_name||' filler FROM test UNION ';
END LOOP;
sql_string := SUBSTR(sql_string, 1, LENGTH(sql_string) - 6);
EXECUTE IMMEDIATE sql_string;
END;
/
SELECT b.cat, a.owner, a.table_name, a.column_name column_nm
FROM all_tab_columns a,
test_v b
WHERE a.column_name = b.filler
AND a.column_name IN (
SELECT filler
FROM test_v);
您显然可以扩展此技术以在一个视图中包含所有内容。
您可以简单地使用以下查询:
Select t.cat, c.owner, c.table_name, c.column_name
from all_tab_columns c
Join test t
On (c.column_name in (t.filler_1, filler_2))
注意:all_tab_columns
视图将提供您的用户有权访问的所有表,user_tab_columns
视图将提供您自己用户的所有表。
干杯!!
我有一个 table 测试,其中包含许多填充列,其值实际上是数据库中某些 table 的列名。我想构建一个查询,其中 returns 所有者,table_name,column_name 用于所有填充列
DROP TABLE TEST;
create table test (cat varchar2(10) , filler_1 varchar2(10), filler_2 varchar2(10));
INSERT INTO TEST
SELECT
'A', 'DOB','BIRTH_DT' FROM DUAL
UNION ALL
SELECT 'B', 'GENDER' ,'T_GENDER' FROM DUAL
UNION ALL
SELECT 'C', 'ACT_ID', 'ACT_NO' FROM DUAL;
COMMIT;
预期输出:
CAT OWNER TABLE_NAME COLUMN_NM
A SCOTT ABC DOB
A SCOTT XXX BIRTH_DT
B HR AAA GENDER
B HR BBB T_GENDER
C SCOTT CCC ACT_ID
C HR DDD ACT_NO
我如何使用 all_tab_columns 实现此目的,因为有许多此类填充列。 谢谢
这是一个使用动态创建视图的脚本选项。那行得通吗?
DECLARE
sql_string VARCHAR2(4000);
CURSOR columns_cur IS
SELECT column_name
FROM all_tab_columns
WHERE table_name = 'TEST'
AND column_name LIKE 'FILLER\_%' ESCAPE '\';
BEGIN
sql_string := 'CREATE OR REPLACE VIEW test_v AS ';
FOR r IN columns_cur LOOP
sql_string := sql_string||' SELECT cat, '||r.column_name||' filler FROM test UNION ';
END LOOP;
sql_string := SUBSTR(sql_string, 1, LENGTH(sql_string) - 6);
EXECUTE IMMEDIATE sql_string;
END;
/
SELECT b.cat, a.owner, a.table_name, a.column_name column_nm
FROM all_tab_columns a,
test_v b
WHERE a.column_name = b.filler
AND a.column_name IN (
SELECT filler
FROM test_v);
您显然可以扩展此技术以在一个视图中包含所有内容。
您可以简单地使用以下查询:
Select t.cat, c.owner, c.table_name, c.column_name
from all_tab_columns c
Join test t
On (c.column_name in (t.filler_1, filler_2))
注意:all_tab_columns
视图将提供您的用户有权访问的所有表,user_tab_columns
视图将提供您自己用户的所有表。
干杯!!