Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle-生成包.过程调用_Oracle_Package_Execution - Fatal编程技术网

Oracle-生成包.过程调用

Oracle-生成包.过程调用,oracle,package,execution,Oracle,Package,Execution,大家早上好, 您知道自动生成Oracle package.procedure调用的简单方法吗 在定义了包之后 Create Or Replace Package PKG1 As Procedure PRC1 ( P_VAL1_I In NUMBER, P_Return_Set_O Out Sys_Refcursor, ); End; 我想通过一个脚本生成这个调用 DEC

大家早上好, 您知道自动生成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;
当然,稍后我将替换输入参数

有什么想法/建议吗?

您是否尝试过:

variable rc refcursor;
exec PKG1.PRC1(0, :rc);
print rc;

您可以创建作业,该作业将在指定的时间间隔调用您的过程

例如:

BEGIN
  DBMS_SCHEDULER.CREATE_JOB
    (
       job_name        => 'JOB_NAME'
      ,start_date      =>  SYSDATE
      ,repeat_interval => 'FREQ=DAILY;BYHOUR=05;BYMINUTE=00;BYSECOND=00'
      ,end_date        => NULL
      ,job_class       => 'DEFAULT_JOB_CLASS'
      ,job_type        => 'PLSQL_BLOCK'
      ,job_action      =>  'BEGIN
                             PKG1.PRC1(P_VAL1_I => 0, P_Return_Set_O => var_P_RETURN_SET_O );
                            END;
      ,comments        => 'JOB_NAME'
    );
  DBMS_SCHEDULER.ENABLE(name => 'JOB_NAME');
END;
这项工作每天早上5点开始


我希望它能解决你的问题

这是我自己的答案。。没有那么难。。只需运行构建过程调用的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;

代码并不完美。但它可以工作…

你的问题是什么?你调用程序,还需要什么?问题是。。如何以编程方式生成调用代码?您的问题仍然不清楚。如果要调用一个过程,那么必须编写一行来执行它。你喜欢什么?点击一个按钮调用程序?如果是,则编写代码以绘制此类按钮,并在单击该按钮时调用该过程-但您仍然必须编写代码。是。。但每次我都需要“写”代码。。正在检查输入/输出参数。。我正在搜索生成代码的程序…您是否浏览了
EXECUTE IMMEDIATE
。在此,您可以将查询作为字符串提供。使用EXECUTE IMMEDIATE,我需要传递过程调用语句。。我不希望每次都键入代码..这不是我想要的:(我正在寻找一种自动生成要执行的代码的方法。。