需用PLSQL,已知一个数据,反查这个数据所在的所有表,这个遍历怎么写,高手帮忙

解决方案 »

  1.   


    DECLARE
      L_V VARCHAR2(100) := 'x';
      L_I INT;
      CURSOR C IS
        SELECT TABLE_NAME FROM USER_TABLES WHERE TABLE_NAME LIKE '%TEST%';
    BEGIN
      FOR I IN C LOOP
        EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM ' || I.TABLE_NAME ||
                          ' where 1>0' INTO L_I;
        /*
        --需要改成你查询表的列
        EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM ' || I.TABLE_NAME ||
                          ' where col=''' || L_v || ''''  INTO L_I;
                          */
        IF L_I > 0 THEN
          DBMS_OUTPUT.PUT_LINE(I.TABLE_NAME || ' 有查询的数据!');
        ELSE
          DBMS_OUTPUT.PUT_LINE(I.TABLE_NAME || ' 没有有查询的数据!');
        END IF;
      END LOOP;
    END;
    /
    输出:
    TEST3 有查询的数据!
    TESTX 没有有查询的数据!
    TEST_DISTICT 有查询的数据!
      

  2.   

    SQL> declare
      2    v_sql varchar2(2000);
      3    v_no  number;
      4  begin
      5    for c in (select table_name, column_id, data_type, column_name
      6                from user_tab_columns a
      7               where exists (select 1
      8                        from user_all_tables b
      9                       where a.TABLE_NAME = b.table_name)
     10               order by table_name, column_id) loop
     11      v_sql := 'select count(1) from ' || c.table_name || ' where ' ||
     12               c.column_name || ' like ''%&text%'' ';
     13      /* dbms_output.put_line('SQL:=' || v_sql); */
     14      execute immediate v_sql
     15        into v_no;
     16      if (v_no > 0) then
     17        dbms_output.put_line('TableName=' || c.table_name ||
     18                             lpad('ColumnName=', 20) || c.column_name ||
     19                             lpad('Number=', 20) || v_no);
     20      end if;
     21    end loop;
     22  end;
     23  /
    输入 text 的值:  L
    原值   12:              c.column_name || ' like ''%&text%'' ';
    新值   12:              c.column_name || ' like ''%L%'' ';
    TableName=DEMO         ColumnName=ENAME             Number=4
    TableName=DEMO         ColumnName=JOB             Number=10
    TableName=T         ColumnName=OWNER             Number=20218
    TableName=T         ColumnName=OBJECT_NAME             Number=8746
    TableName=T         ColumnName=OBJECT_TYPE             Number=16529
    TableName=T         ColumnName=STATUS             Number=40698
    TableName=T_LESSION         ColumnName=LESSION_ID             Number=5
    TableName=T_SCORE         ColumnName=LESSION_ID             Number=6PL/SQL 过程已成功完成。SQL>
      

  3.   

    select table_name, column_id, data_type, column_name
      6                from user_tab_columns a
      7               where exists (select 1
      8                        from user_all_tables b
      9                       where a.TABLE_NAME = b.table_name)
     10               order by table_name, column_id)
    这个没看懂
      

  4.   


    10g的时候oracle增加一个类似回收站的功能(可以把drop掉的表flashback回来),user_tab_columns视图里的字段和表包含了回收站中的表,简单的说,就是我现在创建新用户user,user创建了一个表A,然后user删除了表A,此时,user_all_tables视图查询是没有记录的,但是查询user_tab_columns的话,就可以看到被删除的表A的字段信息。增加exists条件是仅查询当前用户下当前的表,并不查询回收站中的表。
    附:回收站就和windows的回收站的功能类似,也是可以清空的