首页 > 解决方案 > Oracle - 生成 Package.Procedure 调用

问题描述

大家早上好,您知道自动生成 Oracle package.procedure 调用的简单方法吗?

定义包后

 Create Or Replace Package PKG1
    As
    Procedure PRC1
        (
            P_VAL1_I        In  NUMBER,
            P_Return_Set_O  Out Sys_Refcursor,
        );
    End;

我想通过脚本生成调用

 DECLARE
         var_P_RETURN_SET_O SYS_REFCURSOR;
    BEGIN
         PKG1.PRC1(P_VAL1_I => 0, P_Return_Set_O => var_P_RETURN_SET_O );
    END;

当然,我稍后会替换输入参数。

有什么想法/建议吗?

标签: oraclepackageexecution

解决方案


在这里,我自己的答案.. 并不难.. 只需运行一个构建过程调用的 pl/sql。

Declare
    l_Package varchar2(255) :=upper('xxxxxxxxx');
    l_Proc varchar2(255) :=upper('xxxxxxxxxxxx');
Begin
    Dbms_Output.Put_Line('DECLARE');
    For Var_Out In (
        select ObjArg.Argument_Name,Data_type
            FROM sys.user_objects UsrObj 
            Inner Join sys.user_arguments ObjArg On UsrObj.object_id= ObjArg.object_id
            Where UsrObj.object_name = l_Package
            And ObjArg.ObjecT_Name= l_Proc
           AND UsrObj.object_type = 'PACKAGE'
           And ObjArg.In_Out='OUT'
          )
    Loop
        Dbms_Output.Put_Line('L_'||Var_Out.Argument_Name ||' '||Var_Out.Data_type||';');
    end Loop;
    Dbms_Output.Put_Line('BEGIN');
    Dbms_Output.Put_Line(l_Package||'.'||l_Proc);
    Dbms_Output.Put_Line('(');
    For PArams In (
        select ObjArg.Argument_Name,Data_type,ObjArg.In_Out
            FROM sys.user_objects UsrObj 
            Inner Join sys.user_arguments ObjArg On UsrObj.object_id= ObjArg.object_id
            Where UsrObj.object_name = l_Package
            And ObjArg.ObjecT_Name= l_Proc
           AND UsrObj.object_type = 'PACKAGE'
          )
    Loop
        IF PArams.In_Out='OUT' Then
            Dbms_Output.Put_Line(PArams.Argument_Name || '=> L_'||PArams.Argument_Name);
        ELSE
            Dbms_Output.Put_Line(PArams.Argument_Name || '=> xxx');
        End If;
    end Loop;
    Dbms_Output.Put_Line(');');
    Dbms_Output.Put_Line('END');
End;

结果 ..

DECLARE
  L_P_RETURN_SET_O REF CURSOR;
  L_P_EXECUTION_STATUS_O NUMBER;
BEGIN
  PKG.PROC
  (
    P_PARAM_I=> xxx
    P_RETURN_SET_O=> L_P_RETURN_SET_O
  );
END;

代码并不完美..但它有效......


推荐阅读