如何在 Oracle SQL Developer 中多次执行相同的存储过程?
Posted
技术标签:
【中文标题】如何在 Oracle SQL Developer 中多次执行相同的存储过程?【英文标题】:How to execute same stored procedure multiple times in Oracle SQL Developer? 【发布时间】:2017-12-20 03:00:15 【问题描述】:我有一个存储过程,我需要使用不同的输入集多次调用它。看起来脚本可以完成这项工作。如何生成脚本?询问 Oracle SQL Developer(版本 4.2.0.17.089)! ,所以我提出以下内容:
(顺便问一下,这个窗口叫什么?可以从菜单栏访问吗?)
我选择了正确的存储过程,指定了正确的参数,然后单击“保存文件”。这是保存的 SQL 文件:
DECLARE
I_MENU VARCHAR2(200);
ERRMSG VARCHAR2(200);
P_RETURNCUR SYS_REFCURSOR;
BEGIN
I_MENU := '4';
CMS_ACCESS_CONTROL.GETCMSMENUITEMINFO(
I_MENU => I_MENU,
ERRMSG => ERRMSG,
P_RETURNCUR => P_RETURNCUR
);
/* Legacy output:
DBMS_OUTPUT.PUT_LINE('ERRMSG = ' || ERRMSG);
*/
:ERRMSG := ERRMSG;
/* Legacy output:
DBMS_OUTPUT.PUT_LINE('P_RETURNCUR = ' || P_RETURNCUR);
*/
:P_RETURNCUR := P_RETURNCUR; --<-- Cursor
--rollback;
END;
我想多次复制并粘贴BEGIN
和END
之间的行。每次指定其输入参数集(不同的 I_MENU)。但在此之前,我尝试在 SQL Developer 中执行该文件。我没有进行任何修改,但收到此错误:
Error report -
ORA-06550: Line 20, column 22
PLS-00382: expression is of wrong type
ORA-06550: Line 20, column 4
PL/SQL: Statement ignored
06550. 00000 - "line %s, column %s:\n%s"
*Cause: Usually a PL/SQL compilation error.
*Action:
问题:1) 为什么会出现此错误? 2)如何使用不同的参数集多次调用相同的存储过程?我想要一个脚本来执行此操作,因为我必须将脚本传递给另一个人来执行。
这里是存储过程(end getCMSMenuItemInfo
后面绝对没有/
)
Procedure getCMSMenuItemInfo(
i_menu in varchar2,
ERRMSG out varchar2,
P_RETURNCUR out SYS_REFCURSOR)
as
begin
open P_RETURNCUR for
SELECT menu_item, menu_url
FROM someMenu
WHERE menuID = i_menu;
end getCMSMenuItemInfo;
【问题讨论】:
【参考方案1】:-
使用
:ERRMSG
和:P_RETURNCUR
会导致您的错误。您正在尝试使用语法 :variable_a := variable_b
为变量赋值,这在查询工作表中是不允许的。取消注释旧版输出 DBMS_OUTPUT.PUT_LINE();
以测试您的程序。
寻找另一个答案。
【讨论】:
【参考方案2】:我给出这个解决方案的假设是你有一定的标准来选择你将传递给你的过程“CMS_ACCESS_CONTROL.GETCMSMENUITEMINFO”的不同的menuid。我会在理论上告诉你我的方法,也会为你提供代码。
解决方案:
理论方法:
您可以将 menuid 存储在不同的表中,并在调用该过程时遍历该表。现在您必须决定要传递给过程的数量和不同的值。
示例代码:
create table store_id
(
id number
);
insert into store_id select distinct menuID from someMenu;
您可以根据您的业务需求插入不同的 menuid。
DECLARE
I_MENU VARCHAR2(200);
ERRMSG VARCHAR2(200);
P_RETURNCUR SYS_REFCURSOR;
BEGIN
for i in (select id from store_id ) loop
I_MENU := i.id;
GETCMSMENUITEMINFO(
I_MENU => I_MENU,
ERRMSG => ERRMSG,
P_RETURNCUR => P_RETURNCUR
);
/* Legacy output:
DBMS_OUTPUT.PUT_LINE('ERRMSG = ' || ERRMSG);
*/
ERRMSG := ERRMSG;
/* Legacy output:
DBMS_OUTPUT.PUT_LINE('P_RETURNCUR = ' || P_RETURNCUR);
*/
P_RETURNCUR := P_RETURNCUR; --<-- Cursor
--rollback;
end loop;
END;
我希望这会有所帮助。
【讨论】:
以上是关于如何在 Oracle SQL Developer 中多次执行相同的存储过程?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 SQL Developer 中检查语法 Oracle 存储过程?
oracle 客户端 sql developer 如何修改jdk版本