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子句条件来修改它,使其仅包含表?