数据未插入目标 table

Data not inserting to destination table

我在 Oracle 中有以下 PL-SQL 代码块:

DECLARE  TAB VARCHAR(100);
         COL VARCHAR(100);

CURSOR C_COLS IS
          select DISTINCT table_name, column_name
          from all_tab_columns 
          where OWNER = 'MyDB' AND DATA_TYPE LIKE '%VARCHAR%';
BEGIN
    OPEN C_COLS;
    LOOP
      FETCH C_COLS INTO TAB, COL;
      EXIT WHEN C_COLS%notfound; 
        INSERT INTO TargetTable (TABLE_NAME, COLUMN_NAME, COLUMN_VALUE)
        SELECT  DISTINCT   TAB, 
                           COL,
                           (SELECT COL FROM TAB)
FROM TAB
WHERE REGEXP_LIKE(COL, '([ABCDEFGHIJKLMNOPQRSTUVWXYZ])\d\d\d\d\d\d([ABCDEFGHIJKLMNOPQRSTUVWXYZ])', 'ix');
     END LOOP;
     CLOSE C_COLS;
END;

我的想法是确定我相当大的数据库中哪些 table 包含特定的数据模式并找到它们。

所以我想要return三列:表名、列名、列名的值。

以上运行但 return 没有数据,我不明白为什么。游标 returns 中的查询结果,如果我将 table 值硬编码为包含我的正则表达式的简单 select 语句,我会得到结果。我只想要一个包含我期望的数千个结果的结果集。

会不会是我用来动态查找 column_value 的 (SELECT COL FROM TAB)?我不确定我是否可以这样表达。

如果您想 select 动态列,您不妨尝试 dynamic SQL

DECLARE  
  w_sql VARCHAR2(32767);
BEGIN
  DBMS_OUTPUT.enable(32767);
  FOR s_cols IN (
    select DISTINCT 
           table_name
         , column_name
      from all_tab_columns 
     where owner = 'MyDB' 
       AND data_type LIKE '%VARCHAR%'
  )
  LOOP
    w_sql := q'!
      INSERT 
        INTO TargetTable (TABLE_NAME, COLUMN_NAME, COLUMN_VALUE)
      SELECT DISTINCT 
             ':TAB'
           , ':COL'
           , :COL
        FROM :TAB
       WHERE REGEXP_LIKE(:COL, '([ABCDEFGHIJKLMNOPQRSTUVWXYZ])\d\d\d\d\d\d([ABCDEFGHIJKLMNOPQRSTUVWXYZ])', 'ix')
    !';
    w_sql := REPLACE(w_sql, ':TAB', s_cols.table_name);
    w_sql := REPLACE(w_sql, ':COL', s_cols.column_name);
    EXECUTE IMMEDIATE w_sql;
  END LOOP;
  COMMIT;
EXCEPTION
  WHEN OTHERS THEN
    DBMS_OUTPUT.put_line('Error for SQL :'|| w_sql ||'; error is :'|| SQLERRM);
END;