2012-06-12 2 views
0

해당 열이있는 스키마의 각 테이블에서 고유 한 날짜를 "YMDH"라는 열에 가져 오려고합니다. 나는 중첩 된 커서를 사용할 필요가 있다고 생각 (뭔가 내가 해본 적이 없다) 다음 코드를 내놓았다 :Oracle 중첩 커서

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 개발자는 내부 커서 SELECT 문에 대해 불평한다. 오류 메시지는 다음과 같습니다

오류 (18,32) : PL/SQL : SQL 문 무시 오류 (18,70) : PL/SQL은 : ORA-00942 : 테이블 또는 뷰가 존재하지 않는

외부 커서에 대한 참조를 인식하지 못합니다. 내부 커서에 테이블 이름 (cursor_rec.object_name)을 어떻게 전달합니까?

+3

번째 질의 동적되어야한다; 'cursor_rec.object_name'은 _string입니다. 또한 이것은 약간의 SQL Injection-y입니다. – Ben

+0

+1 "SQL Injection-y"only ... – Ollie

답변

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; 
+0

도움을 주셔서 감사합니다! –

+0

루프에 대한 커서에서 user_tables로 JOIN을 생략하고 user_tab_columns (user_tab_columns에는 table_name도 포함)에서 선택할 수 있습니다. –

관련 문제