Oracle-生成包.过程调用
大家早上好, 您知道自动生成Oracle package.procedure调用的简单方法吗 在定义了包之后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
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,我需要传递过程调用语句。。我不希望每次都键入代码..这不是我想要的:(我正在寻找一种自动生成要执行的代码的方法。。