如何在Oracle SQL Developer中多次执行相同的存储过程?

问题描述 投票:0回答:2

我有一个存储过程,我需要使用不同的输入集调用它几次。它看起来像一个脚本可以完成这项工作。如何生成脚本?询问Oracle SQL Developer(版本4.2.0.17.089)! ,所以我提出以下内容:Run PL/SQL box

(顺便说一句,这个窗口叫什么?可以从菜单栏访问吗?)

我选择正确的存储过程,指定正确的参数并单击“保存文件”。这是保存的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;

我想多次复制并粘贴BEGINEND之间的线条。每次指定其输入参数集(不同的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;
oracle stored-procedures oracle-sqldeveloper
2个回答
0
投票
  1. 使用:ERRMSG:P_RETURNCUR导致您的错误。您正尝试使用语法:variable_a := variable_b为变量赋值,这在查询工作表中是不允许的。取消注释遗留输出DBMS_OUTPUT.PUT_LINE();以测试您的过程。
  2. 寻找另一个答案。

0
投票

我假设你有一些选择不同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;  

我希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.