How to execute a local procedure using execute immedate?

后端 未结 2 1204
后悔当初
后悔当初 2021-01-25 07:36

I have the below PL SQL Block:

WHENEVER SQLERROR EXIT 1
SET SERVEROUTPUT ON   

DECLARE
v_sql VARCHAR2(500);
f1 VARCHAR2(20) := \'abc\';
p_procname VARCHAR2 (30)         


        
2条回答
  •  甜味超标
    2021-01-25 08:16

    Use it like this:

    DECLARE
    v_sql VARCHAR2(500);
    f1 VARCHAR2(20) := 'abc';
    p_procname VARCHAR2 (30) := 'OPENLOG';
    
       PROCEDURE OPENLOG (file_name IN VARCHAR2)
       IS
       BEGIN
          NULL;
       END;    
    
    BEGIN
    DBMS_OUTPUT.PUT_LINE('Begin');
    openlog(f1);
    END;
    

    You don't need to use execute immediate with begin end in this case, because you have the procedure in the declare section.

    The other way is create the procedure as a database object like this:

           CREATE PROCEDURE OPENLOG (file_name IN VARCHAR2)
           IS
           BEGIN
              NULL;
           END;  
    

    And the you can use execute immediate:

    DECLARE
    v_sql VARCHAR2(500);
    f1 VARCHAR2(20) := 'abc';
    p_procname VARCHAR2 (30) := 'OPENLOG';
    
    BEGIN
    DBMS_OUTPUT.PUT_LINE('Begin');
    v_sql := 'BEGIN ' || p_procname || '(:a); END;';
    EXECUTE IMMEDIATE v_sql USING IN f1;
    END;
    

提交回复
热议问题