2017-02-07 7 views
0

질문이 있습니다. 어떤 프로 시저 또는 함수를 동적으로 실행하기 위해 PLSQL 코드를 작성하고 있습니다. 메타 데이터 테이블을 사용하여이 방법으로 실행할 SQL 요소를 확인합니다.USING 절의 동적 매개 변수

V_COMMAND := 'BEGIN PROC_EX(:1,:2,:3,:4); END;'; 

을 그러나 문제는에서 나는 동적 인 방법을 사용 절에 바인드 변수를 필요로하기 때문에 명령이 즉시 실행이 적용됩니다 : 일부 코드

프로세스는 유사한 블록을 구축하는 정보를 복구합니다. String 변수를 생성하여 모든 매개 변수를 저장하려고 시도했지만 실행시 오라 오류 ORA-01008가 발생했습니다. P_TABLE, P_WHERE, O_MESSAGEO_CODE 코드를 시작으로 선언 된 변수입니다

V_PARAMS := 'IN P_TABLE, IN P_WHERE, OUT O_MESSAGE, OUT O_CODE'; 

:

내가 저장 PARAMS에 임시 VAR를 만들었습니다.

그리고 명령이 방법으로 실행 : 가능 매핑 변수가 절을 사용의 동적 인 방법

EXECUTE IMMEDIATE V_COMMAND USING V_PARAMS; 

인가를?

+0

감사합니다, 나는 코드 스타일로 텍스트를 변경하지 방법을 알고하지 않습니다. – rbarbalho

답변

1

당신은 당신의 요구에 맞는 사용의 DBMS_SQL

예를 찾고 있습니다 : 편집 내 질문에 대한

CREATE OR REPLACE PROCEDURE foo (n NUMBER, square OUT NUMBER) IS 
     BEGIN square := n * n; END;/ 

     CREATE OR REPLACE PROCEDURE bulk_plsql 
     (n DBMS_SQL.NUMBER_TABLE, square OUT DBMS_SQL.NUMBER_TABLE) IS 
     c NUMBER; 
     r NUMBER; 
     BEGIN 
     c := DBMS_SQL.OPEN_CURSOR; 
     DBMS_SQL.PARSE(c, 'BEGIN foo(:bnd1, :bnd2); END;', DBMS_SQL.NATIVE); 
     DBMS_SQL.BIND_ARRAY(c, 'bnd1', n); 
     DBMS_SQL.BIND_ARRAY(c, 'bnd2', square); 
     r := DBMS_SQL.EXECUTE(c); 
     DBMS_SQL.VARIABLE_VALUE(c, 'bnd2', square); 
    END; 
    /
+0

답변 해 주셔서 감사합니다. – rbarbalho