0

その列が存在するスキーマの各テーブルから、「YMDH」という列の個別の日付を取得したいと考えています。ネストされたカーソルを使用する必要があると考えて (これまでに行ったことがないこと)、次のコードを思いつきました。

CREATE OR REPLACE PROCEDURE DistinctDates AS 
   sql_statement1 varchar2(200);
   sql_statement2 varchar2(200);
   results varchar2(15);
   ColumnExist integer;
BEGIN
    for cursor_rec in (SELECT * FROM user_objects WHERE object_type='TABLE'
    AND object_name NOT LIKE 'TM%')  loop
    sql_statement1 := 'select count (*) from user_tab_columns where table_name=' || '''' || cursor_rec.object_name || '''' || ' and column_name=' || '''' ||'YMDH'  || '''';
    execute immediate sql_statement1 into ColumnExist;
    if ColumnExist = 1 then
      for inner_cursor_rec in (select distinct(ymdh) from cursor_rec.object_name) loop
         null;
      end loop;
    end if;
    end loop;
END DistinctDates;

SQL Developer は、内部カーソルの選択ステートメントについて不平を言っています。エラーメッセージは次のとおりです。

エラー (18,32): PL/SQL: SQL ステートメントは無視されました エラー (18,70): PL/SQL: ORA-00942: テーブルまたはビューが存在しません

したがって、外側のカーソルへの参照を認識していません。テーブル名 (cursor_rec.object_name) を内部カーソルに渡すにはどうすればよいですか?

4

1 に答える 1

1

動的 SQL が不要な場所で使用され、必要な場所で使用されていない!

テーブルに「YMDH」という列があるかどうかを確認するチェックを最初のクエリに組み込むと、次のコードが得られます。

CREATE OR REPLACE PROCEDURE DistinctDates AS 
   sql_statement varchar2(200);
   rc sys_refcursor;
   ymdh_value ????; -- Appropriate data type
BEGIN
    for cursor_rec in (SELECT t.table_name 
                       FROM user_tables t
                       JOIN user_tab_columns c ON c.table_name = t.table_name
                       WHERE t.table_name NOT LIKE 'TM%'
                       AND c.column_name='YMDH')  
    loop
        sql_statement := 'select distinct(ymdh) from ' || cursor_rec.table_name;
        open rc for sql_statement;
        loop
            fetch rc into ymdh_value;
            exit when rc%notfound;
            null;
        end loop;
        close rc;
    end loop;
END DistinctDates;
于 2012-06-13T09:12:05.327 に答える