2014-11-29 2 views
0

Oracle에서 테이블의 열을 반복하고 열 이름과 데이터 형식을 저장하는 간단한 커서를 만들려고합니다. 입력을 사용하여 테이블 이름을 동적으로 지정합니다. 프로 시저 (선언되지 않은 변수 등)를 컴파일하려고 할 때 여러 가지 오류 메시지가 나타납니다. 나는 나의 기본 구조를 틀리게해야한다.커서 동적 SQL 사용

CREATE OR REPLACE PROCEDURE DV 
(
TABLENAME IN VARCHAR2 
) 
authid current_user 

AS 

    sql_qx varchar2(5000); 
    curTab varchar2(5000); 
    curCol varchar2(5000); 
    curTyp varchar2(5000); 


    BEGIN 

    sql_qx := 'DECLARE CURSOR tblCur IS 
       SELECT table_name, 
        column_name, 
        data_type 
       FROM user_tab_columns 
       WHERE table_name = ''' || TABLENAME || ''''; 

    execute immediate sql_qx; 


    IF NOT tblCur%ISOPEN THEN 
    OPEN tblCur; 
    END IF; 

    FETCH tblCur INTO curTab, curCol, curTyp; 
    WHILE tblCur%FOUND THEN 
     LOOP 

     dbms_output.put_line(tblCur.curTab || ' ' ||tblCur.curCol || ' ' ||tblCur.curTyp); 

    FETCH tblCur INTO curTab, curCol, curTyp; 

    END LOOP; 
    END DV; 

답변

0

이 시도 :

CREATE OR REPLACE PROCEDURE DV (TABLENAME IN VARCHAR2) authid current_user 
AS 
BEGIN 
    FOR c IN (SELECT table_name, column_name, data_type 
       FROM user_tab_columns 
       WHERE table_name = TABLENAME) 
    LOOP 
     dbms_output.put_line(c.table_name || ' ' || c.column_name || ' ' || c.data_type); 
    END LOOP; 
END DV; 
:

CREATE OR REPLACE PROCEDURE DV (TABLENAME IN VARCHAR2) authid current_user 
AS 
    curTab varchar2(5000); 
    curCol varchar2(5000); 
    curTyp varchar2(5000); 

    CURSOR tblCur IS 
    SELECT table_name, column_name, data_type 
    FROM user_tab_columns 
    WHERE table_name = TABLENAME; 

BEGIN 
    IF NOT tblCur%ISOPEN THEN 
     OPEN tblCur; 
    END IF; 

    LOOP 
     FETCH tblCur INTO curTab, curCol, curTyp; 
     EXIT WHEN tblCur%NOTFOUND; 
     dbms_output.put_line(curTab || ' ' || curCol || ' ' || curTyp); 
    END LOOP; 
END DV; 

당신도 여기에 명시 적 커서가 필요하지 않습니다 이것은 내가 지금까지 무엇을 가지고