如何在 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;

我想多次复制并粘贴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;

【问题讨论】:

【参考方案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 中多次执行相同的存储过程?的主要内容,如果未能解决你的问题,请参考以下文章

如何安装pl/sql developer

如何安装pl/sql developer

如何在 SQL Developer 中检查语法 Oracle 存储过程?

oracle 客户端 sql developer 如何修改jdk版本

如何在 Oracle SQL Developer 中查询数据库名称?

如何在 oracle sql developer 中运行存储过程?