Sql Oracle根据列值获取表名
我有这样的桌子:Sql Oracle根据列值获取表名,sql,oracle,Sql,Oracle,我有这样的桌子: Table-1 Table-2 Table-3 Table-4 Table-5 每个表都有许多列,其中一个列名是employee_id 现在,我想写一个查询,它将 1返回包含此列和的所有表 2通过传递employee_id,结果应显示该列是否具有值或空值 e、 g.显示表1、表2、表3中的表名、列名,。。。其中,employee_id='1234' 如果其中一个表没有此列,则不需要显示 我已经用进行了验证,但它只显示表名和列名,而不向其传递一些列值 也验证了,但这里验证了我不
Table-1
Table-2
Table-3
Table-4
Table-5
每个表都有许多列,其中一个列名是employee_id
现在,我想写一个查询,它将
1返回包含此列和的所有表
2通过传递employee_id,结果应显示该列是否具有值或空值
e、 g.显示表1、表2、表3中的表名、列名,。。。其中,employee_id='1234'
如果其中一个表没有此列,则不需要显示
我已经用进行了验证,但它只显示表名和列名,而不向其传递一些列值
也验证了,但这里验证了我不想做的整个模式
更新:
找到了一个解决方案,但通过使用xmlsequence
1如何将此代码设置为xmltable
2如果表中没有值,则输出应为空/空。或默认为YES值
WITH char_cols AS
(SELECT /*+materialize */ table_name, column_name
FROM cols
WHERE data_type IN ('CHAR', 'VARCHAR2') and table_name in ('Table-1','Table-2','Table-3','Table-4','Table-5'))
SELECT DISTINCT SUBSTR (:val, 1, 11) "Employee_ID",
SUBSTR (table_name, 1, 14) "Table",
SUBSTR (column_name, 1, 14) "Column"
FROM char_cols,
TABLE (xmlsequence (dbms_xmlgen.getxmltype ('select "'
|| column_name
|| '" from "'
|| table_name
|| '" where upper("'
|| column_name
|| '") like upper(''%'
|| :val
|| '%'')' ).extract ('ROWSET/ROW/*') ) ) t ORDER BY "Table"
/
试着使用下面的代码。 请注意,可能需要在循环中澄清方案名称。 这段代码适用于我的本地数据库。 打开服务器输出
DECLARE
ex_query VARCHAR(300);
num NUMBER;
emp_id number;
BEGIN
emp_id := <put your value>;
FOR rec IN
(SELECT table_name
FROM all_tab_columns
WHERE column_name LIKE upper('employee_id')
)
LOOP
num :=0;
ex_query := 'select count(*) from ' || rec.table_name || ' where employee_id = ' || emp_id;
EXECUTE IMMEDIATE ex_query into num;
if (num>0) then
DBMS_OUTPUT.PUT_LINE(rec.table_name);
end if;
END LOOP;
END;
试着使用下面的代码。 请注意,可能需要在循环中澄清方案名称。 这段代码适用于我的本地数据库。 打开服务器输出
DECLARE
ex_query VARCHAR(300);
num NUMBER;
emp_id number;
BEGIN
emp_id := <put your value>;
FOR rec IN
(SELECT table_name
FROM all_tab_columns
WHERE column_name LIKE upper('employee_id')
)
LOOP
num :=0;
ex_query := 'select count(*) from ' || rec.table_name || ' where employee_id = ' || emp_id;
EXECUTE IMMEDIATE ex_query into num;
if (num>0) then
DBMS_OUTPUT.PUT_LINE(rec.table_name);
end if;
END LOOP;
END;
我尝试使用xml,但我遇到了一个无法解决的错误。关于零大小的结果。解决这个问题而不是引发异常有多困难?!问问甲骨文 无论如何。 您可以使用COLS表了解哪个表具有employee_id列 1表中的哪个表,比如,我假设有表名的列是C,有这个列吗
select *
from COLS, TABLE_LIKE_THIS t
where cols.table_name = t
and cols.column_name = 'EMPLOYEE_ID'
-- think Oracle metadata/ think upper case
2哪一个具有您要寻找的值:使用executeimmediate编写一小段动态PL/SQL,以统计与上述条件匹配的表
declare
v_id varchar2(10) := 'JP1829'; -- value you are looking for
v_col varchar2(20) := 'EMPLOYEE_ID'; -- column
n_c number := 0;
begin
for x in (
select table_name
from all_tab_columns cols
, TABLE_LIKE_THIS t
where cols.table_name = t.c
and cols.column_name = v_col
) loop
EXECUTE IMMEDIATE
'select count(1) from '||x.table_name
||' where Nvl('||v_col||', ''@#'') = ''' ||v_id||'''' -- adding quotes around string is a little specific
INTO n_c;
if n_c > 0 then
dbms_output.put_line(n_C|| ' in ' ||x.table_name||' has '||v_col||'='||v_id);
end if;
-- idem for null values
-- ... ||' where '||v_col||' is null '
-- or
-- ... ||' where Nvl('||v_col||', ''@#'') = ''@#'' '
end loop;
dbms_output.put_line('done.');
end;
/
希望这能有所帮助我尝试使用xml,但遇到了一个无法解决的错误。关于零大小的结果。解决这个问题而不是引发异常有多困难?!问问甲骨文 无论如何。 您可以使用COLS表了解哪个表具有employee_id列 1表中的哪个表,比如,我假设有表名的列是C,有这个列吗
select *
from COLS, TABLE_LIKE_THIS t
where cols.table_name = t
and cols.column_name = 'EMPLOYEE_ID'
-- think Oracle metadata/ think upper case
2哪一个具有您要寻找的值:使用executeimmediate编写一小段动态PL/SQL,以统计与上述条件匹配的表
declare
v_id varchar2(10) := 'JP1829'; -- value you are looking for
v_col varchar2(20) := 'EMPLOYEE_ID'; -- column
n_c number := 0;
begin
for x in (
select table_name
from all_tab_columns cols
, TABLE_LIKE_THIS t
where cols.table_name = t.c
and cols.column_name = v_col
) loop
EXECUTE IMMEDIATE
'select count(1) from '||x.table_name
||' where Nvl('||v_col||', ''@#'') = ''' ||v_id||'''' -- adding quotes around string is a little specific
INTO n_c;
if n_c > 0 then
dbms_output.put_line(n_C|| ' in ' ||x.table_name||' has '||v_col||'='||v_id);
end if;
-- idem for null values
-- ... ||' where '||v_col||' is null '
-- or
-- ... ||' where Nvl('||v_col||', ''@#'') = ''@#'' '
end loop;
dbms_output.put_line('done.');
end;
/
希望这对您有所帮助使用未弃用的XMLTABLE一步完成此查询 示例模式 质疑 结果
此查询可以使用未弃用的XMLTABLE一步完成 示例模式 质疑 结果
示例数据和所需结果将非常有用。我认为您可能需要分两个步骤来完成此操作—获取包含该列的表列表,然后分别或使用UNION ALL查询这些表中的每一个以获取数据。这样做的最大问题是无法在一次SQL查询中一次性完成。这是因为您必须查询包含EMPLOYEE_ID列的表以获取输入值,但还必须查询数据目录以首先查找这些表。但是,对表的查询必须事先知道表的名称。您正在寻找动态SQL,这是一个高级主题—您是否觉得有足够的高级能力来询问此类问题?在您说已验证的第二个链接中,该过程使用cols搜索整个模式,cols是用户选项卡列的同义词。为什么不通过添加where子句条件来修改它,使其仅包含表?示例数据和所需结果将非常有用。我认为您可能需要分两步来完成此操作—获取包含列的表列表,然后分别或使用UNION ALL查询这些表中的每一个以获取数据。这样做的最大问题是不能在一次SQL查询中一次性完成。这是因为您必须查询包含EMPLOYEE_ID列的表以获取输入值,但还必须查询数据目录以首先查找这些表。但是,对表的查询必须事先知道表的名称。您正在寻找动态SQL,这是一个高级主题—您是否觉得有足够的高级能力来询问此类问题?在您说已验证的第二个链接中,该过程使用cols搜索整个模式,cols是用户选项卡列的同义词。为什么不通过添加where子句条件来修改它,使其仅包含表?