2012-08-09 3 views
1

Stored-Procedure에 매개 변수로 전달되는 테이블 이름에 대해 rowtype을 만들 수 있으며 DBMS_OUUTPUT.PUT_LINE() 문에서 주소를 지정하는 열을 어떻게 알 수 있습니까?저장 프로 시저에 매개 변수로 테이블 이름을 전달하는 방법은 무엇입니까?

최종 사용자는

나는 다음과 같이 뭔가를 원하는 사용자 이름 (스키마)와 테이블 이름을 줄 수 있지만 작동하지 않습니다.

CREATE OR REPLACE PROCEDURE SP_PASS(USER_NAME VARCHAR2,TAB_NAME IN VARCHAR2) 
AS 
    TYPE REF_CUR IS REF CURSOR; 
    V_ARR REF_CUR; 
    V_SQL VARCHAR(200); 
    V_ROWTYPE USER_NAME.TAB_NAME%ROWTYPE; 
BEGIN 
    V_SQL := 'SELECT * FROM '||USER_NAME||'.'||TAB_NAME; 
    OPEN V_ARR FOR V_SQL; 
    LOOP 
    FETCH V_ARR INTO V_ROWTYPE; 
    EXIT WHEN V_ARR%NOT FOUND; 
    DBMS_OUTPUT.PUT_LINE(V_ROWTYPE.COL1||','||V_ROWTYPE.COL2||','||V_ROWTYPE.COL3); 
    END LOOP; 
    CLOSE V_ARR; 
END; 

가능한 경우 알려 주시기 바랍니다.

감사합니다.

답변

6

알 수없는 테이블에 대해 %ROWTYPE 변수를 만들 수 없으며 컴파일 할 때 테이블 이름을 알지 못하면 정적으로 열 이름을 참조 할 수 없습니다.

dbms_sql package을 사용하여 완전히 동적 인 SQL 문을 처리 할 수 ​​있습니다. SQL 문을 준비하고 열 수를 찾아 열의 유형과 데이터 형식을 찾고 적절한 변수를 바인딩 한 다음 데이터를 가져와야합니다. 게시 한 예제보다 코드를 작성하는 것이 훨씬 더 번거로운 방법이지만 극단적 인 유연성을 제공합니다.

내가 링크 된 문서에서 dbms_sql 패키지를 사용하는 많은 예제가 있습니다. UTL_FILE을 사용하여 임의의 쿼리의 결과를 CSV 파일에 쓰는 Tom Kyte의 dump_csv function을 확인할 수도 있습니다. 실제로 데이터를 DBMS_OUTPUT에 쓰려면 DBMS_OUTPUT으로 UTL_FILE 콜을 간단하게 바꿀 수 있습니다. 하지만 실제로 데이터를 DBMS_OUTPUT 버퍼에 쓰는 것보다 더 유용한 것을하고 싶다면 Tom의 프로 시저가 실제로 수행하려고하는 것과 더 가깝습니다.

관련 문제