首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Oracle SQL Developer中多次执行相同的存储过程?

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

Stack Overflow用户
提问于 2017-12-20 03:00:15
回答 2查看 3.9K关注 0票数 0

我有一个存储过程,需要用不同的输入集多次调用它。看上去一个脚本就能完成这个任务。如何生成脚本?请询问Oracle SQL Developer (Version 4.2.0.17.089),因此我将介绍以下内容:

(顺便问一下,这扇窗户叫什么名字?这能从菜单栏上找到吗?)

我选择正确的存储过程,指定正确的参数并单击“保存文件”。下面是保存的SQL文件:

代码语言:javascript
运行
复制
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)。但是在这样做之前,我尝试在中执行该文件。我没有做任何修改,但得到了以下错误:

代码语言:javascript
运行
复制
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)

代码语言:javascript
运行
复制
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;
EN

Stack Overflow用户

发布于 2017-12-20 18:25:55

我给出这个解决方案是基于这样一个假设,即您有一定的标准来选择不同的菜单,这将传递给您的过程"CMS_ACCESS_CONTROL.GETCMSMENUITEMINFO“。从理论上讲,我将告诉您我的方法,并为您提供代码。

解决方案:

理论方法:

您可以将菜单存储在不同的表中,并在调用过程时遍历该表。现在,您必须决定要将多少值和哪些不同值传递给您的过程。

示例代码:

代码语言:javascript
运行
复制
create table store_id
(
id number
);  

insert into store_id select distinct menuID from someMenu; 

您可以根据您的业务需求插入不同的菜单。

代码语言:javascript
运行
复制
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;  

我希望这能帮到你。

票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47898178

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档