我有一个存储过程,我需要使用不同的输入集调用它几次。它看起来像一个脚本可以完成这项工作。如何生成脚本?询问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;
:ERRMSG
和:P_RETURNCUR
导致您的错误。您正尝试使用语法:variable_a := variable_b
为变量赋值,这在查询工作表中是不允许的。取消注释遗留输出DBMS_OUTPUT.PUT_LINE();
以测试您的过程。我假设你有一些选择不同menuid的标准,你将传递给你的程序“CMS_ACCESS_CONTROL.GETCMSMENUITEMINFO”,我给出了这个解决方案。我会在理论上告诉你我的方法,也会为你提供代码。
解:
理论方法:
您可以将menuid存储在另一个表中,并在调用该过程时循环遍历该表。现在,您必须确定要传递给过程的值和数量。
Sampe代码:
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;
我希望这有帮助。