Sql 从所有选项卡查找表和列信息
我试图根据存储过程中包含的列来识别表类型。我最初提出的问题如下:Sql 从所有选项卡查找表和列信息,sql,oracle,system-views,Sql,Oracle,System Views,我试图根据存储过程中包含的列来识别表类型。我最初提出的问题如下: SELECT CASE WHEN col_one. IS NOT NULL THEN 'COL1' WHEN col_two IS NOT NULL THEN 'COL2' ELSE 'NEITHER' END INTO ls_table_type FROM (SELECT column_name
SELECT CASE WHEN col_one. IS NOT NULL THEN 'COL1'
WHEN col_two IS NOT NULL THEN 'COL2'
ELSE 'NEITHER'
END
INTO ls_table_type
FROM (SELECT column_name col_one
FROM sys.all_tab_cols
WHERE upper ( owner ) = upper ( '|OWNER|' )
AND hidden_column = 'NO'
AND virtual_column = 'NO'
AND column_id IS NOT NULL
AND column_name = '|COL1_NAME|'
AND table_name = upper(|TABLE_NAME|))
,(SELECT column_name as col_two
FROM sys.all_tab_cols
WHERE upper ( owner ) = upper ( '|OWNER|' )
AND hidden_column = 'NO'
AND virtual_column = 'NO'
AND column_id IS NOT NULL
AND column_name = '|COL2_NAME|'
AND table_name = upper(|TABLE_NAME|))
除非两列都存在于表中,否则这不起作用。我确信我没有找到一些明显的方法来解决这个问题。这个查询应该会提供您需要的信息。如果col1和col2不在同一个表中,则不会得到任何重复记录
select table_name, column_name
from all_tab_cols
where owner = '?'
and column_name in ('col1', 'col2')
and table_name = '?'; -- this line optional
你可以试试这个:
SELECT CASE WHEN EXISTS (SELECT column_name col_one
FROM sys.all_tab_cols
WHERE upper ( owner ) = upper ( '|OWNER|' )
AND hidden_column = 'NO'
AND virtual_column = 'NO'
AND column_id IS NOT NULL
AND column_name = '|COL1_NAME|'
AND table_name = upper('|TABLE_NAME|'))
THEN 'COL1'
WHEN EXISTS (SELECT column_name as col_two
FROM sys.all_tab_cols
WHERE upper ( owner ) = upper ( '|OWNER|' )
AND hidden_column = 'NO'
AND virtual_column = 'NO'
AND column_id IS NOT NULL
AND column_name = '|COL2_NAME|'
AND table_name = upper('|TABLE_NAME|'))
THEN 'COL2'
ELSE 'NEITHER'
END
FROM DUAL;