在SQL Developer中运行存储过程?


81

我正在尝试运行具有多个输入输出参数的存储过程。只能通过导航“其他用户” |“连接”面板来查看该过程。| 套餐| |

如果我单击右键,则菜单项为“订购成员依据...”和“创建单元测试”(显示为灰色)。当用户访问该过程时,似乎无法“运行”该过程。

我一直在尝试找到一个示例,该示例说明如何创建匿名块,以便可以将过程作为SQL文件运行,但没有找到任何有效的方法。

有谁知道如何从SQL Developer执行此过程?我正在使用2.1.1.64版。

提前致谢!

编辑1:

我要调用的过程具有以下签名:

user.package.procedure(
   p_1 IN  NUMBER,
   p_2 IN  NUMBER,
   p_3 OUT VARCHAR2,
   p_4 OUT VARCHAR2,
   p_5 OUT VARCHAR2,
   p_6 OUT NUMBER)

如果我这样写我的匿名块:

DECLARE
   out1 VARCHAR2(100);
   out2 VARCHAR2(100);
   out3 VARCHAR2(100);
   out4 NUMBER(100);
BEGIN
   EXECUTE user.package.procedure (33,89, :out1, :out2, :out3, :out4);
END;

我得到错误:

Bind Varialbe "out1" is NOT DECLCARED
anonymous block completed

我试过初始化out *变量:

   out1 VARCHAR2(100) := '';

但得到同样的错误:

编辑2:

根据Alex的回答,我尝试从参数前面移除冒号并得到以下信息:

Error starting at line 1 in command:
DECLARE
   out1 VARCHAR2(100);
   out2 VARCHAR2(100);
   out3 VARCHAR2(100);
   out4 NUMBER(100);
BEGIN
   EXECUTE user.package.procedure (33,89, out1, out2, out3, out4);
END;
Error report:
ORA-06550: line 13, column 17:
PLS-00103: Encountered the symbol "USER" when expecting one of the following:

   := . ( @ % ; immediate
The symbol ":=" was substituted for "USER" to continue.
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:


尝试将OUT变量放在过程执行语句之前的BEGIN中。
OMG小马

您不需要execute; 在PL / SQL中,它解释为的开始execute immediate,这与SQL不同execute
亚历克斯·普尔

2
@sdoca:您现在将两种方法混淆了;对于您的edit 2版本,只需删除单词即可execute。本declare应该是前begin。我认为@OMG的意思是,您可以在带有variable关键字的匿名块之前在SQL Developer中声明变量,然后使用:out1最初使用的语法,在这种情况下,您根本没有declare节。但是,您将最后一条评论混为一谈。
Alex Poole 2010年

1
是的,我知道我很困惑,但是不确定在哪里/如何做。
sdoca

Answers:


75

使用简单的参数类型(即没有refcursors等),您可以执行以下操作:

SET serveroutput on;
DECLARE
    InParam1 number;
    InParam2 number;
    OutParam1 varchar2(100);
    OutParam2 varchar2(100);
    OutParam3 varchar2(100);
    OutParam4 number;
BEGIN
    /* Assign values to IN parameters */
    InParam1 := 33;
    InParam2 := 89;

    /* Call procedure within package, identifying schema if necessary */
    schema.package.procedure(InParam1, InParam2,
        OutParam1, OutParam2, OutParam3, OutParam4);

    /* Display OUT parameters */
    dbms_output.put_line('OutParam1: ' || OutParam1);
    dbms_output.put_line('OutParam2: ' || OutParam2);
    dbms_output.put_line('OutParam3: ' || OutParam3);
    dbms_output.put_line('OutParam4: ' || OutParam4);
END;
/


编辑以使用OP的规范,以及使用:var绑定变量的替代方法:

var InParam1 number;
var InParam2 number;
var OutParam1 varchar2(100);
var OutParam2 varchar2(100);
var OutParam3 varchar2(100);
var OutParam4 number;

BEGIN
    /* Assign values to IN parameters */
    :InParam1 := 33;
    :InParam2 := 89;

    /* Call procedure within package, identifying schema if necessary */
    schema.package.procedure(:InParam1, :InParam2,
        :OutParam1, :OutParam2, :OutParam3, :OutParam4);
END;
/

-- Display OUT parameters
print :OutParam1;
print :OutParam2;
print :OutParam3;
print :OutParam4;

1
+1个不错的答案。出于好奇,您知道哪个是首选?
康拉德·弗里克斯

@Conrad:我想这是一个偏爱,尽管可能会有更多的上下文切换:var方式。declare如果我在PL / SQL上做任何事情,我会默认使用这种方式。但是,:var如果我使用的是从Pro * C复制过来的已有代码,并且已经具有该语法,而我又不想触及调用中的参数,那么我可能会使用。
亚历克斯·普尔

2
感谢您的帮助和详细的答案。我相信这也会对其他人有所帮助。要注意的一件事是,它们必须作为脚本而不是语句运行。
sdoca

1
在sql developer中运行时,我不必在变量名前面加上前缀:(实际上,它不起作用)。
haridsv

29

执行容易。获得结果可能很难。

看看这个问题,我问过最佳方法/工具以从oracle包过程中获取结果

它的摘要是这样的。

假设您有一个名为mypackage的Package和一个名为getQuestions的过程。它返回一个refcursor并接受字符串用户名。

您要做的就是创建新的SQL文件(新文件)。设置连接并粘贴以下内容并执行。

var r refcursor;
exec mypackage.getquestions(:r, 'OMG Ponies');
print r;

3
我必须使用完整的单词“ execute”而不是“ exec”
Patrick

21

对于那些使用SqlDeveloper 3+的用户,以防万一您错过了:

SqlDeveloper具有直接执行存储的proc /函数的功能,并且以易于阅读的方式显示输出。

只需右键单击package / stored proc / stored函数,单击Run并选择target要执行的proc / func,SqlDeveloper将生成要执行的代码段(以便您可以输入输入参数)。一旦执行,输出参数将显示在对话框的下半部分,它甚至具有对ref游标的内置支持:游标的结果将显示为单独的输出选项卡。


2
这应该是选定的答案。
EvilTeach

12

在SQL Developer中打开该过程,然后从那里运行它。SQL Developer显示它运行的SQL。

BEGIN
  PROCEEDURE_NAME_HERE();
END;

6

采用:

BEGIN

  PACKAGE_NAME.PROCEDURE_NAME(parameter_value, ...);

END;

将“ PACKAGE_NAME”,“ PROCEDURE_NAME”和“ parameter_value”替换为所需的内容。OUT参数将需要在之前声明。


2

尽管这个问题已经很老了,但我一直在陷入同样的​​结果,而没有找到从SQL Developer运行的简单方法。经过几次尝试,我找到了一种从sql developer本身执行存储过程的简单方法。

  • 在“包”下,选择所需的包,然后右键单击包名称(而不是存储过程名称)。

  • 您会找到运行选项。选择该选项并提供必需的参数。单击确定,您可以在下面的输出变量部分中看到输出

我正在使用SQL开发人员版本4.1.3.20


1

这些其他答案都对我无济于事。这是我在SQL Developer 3.2.20.10中运行过程所要做的:

SET serveroutput on;
DECLARE
  testvar varchar(100);
BEGIN
  testvar := 'dude';
  schema.MY_PROC(testvar);
  dbms_output.enable;
  dbms_output.put_line(testvar);
END;

然后,您必须检查表以了解proc应该与该传入变量进行什么关联-输出将仅确认该变量已接收该值(并且理论上将其传递给proc)。

注意(与我和其他人的区别):

  • :变量名称前无
  • 不推杆 .package..packages.架构名称和程序名称之间
  • 无需放置 &在变量的值中加上。
  • 不使用 print任何地方
  • 没有var用于声明变量

所有这些问题使我花了最长的时间挠头,而这些答案却将这些严重的错误排除在外,并污了。


0

不敢相信,这不会在SQL Developer中执行:

var r refcursor;
exec PCK.SOME_SP(:r,
 '02619857');

print r;

但是这将:

var r refcursor;
exec TAPI_OVLASCENJA.ARH_SELECT_NAKON_PRESTANKA_REG(:r, '02619857');

print r;

显然,所有内容都必须合而为一。


2
[该execute命令的SQL * Plus文档]指出。但是,这并不是对所提问题的答案,无论如何,其他问题的相关答案已经涵盖了该问题
Alex Poole

能够在SQL Developer中使用它。谢谢
Sergejs 2015年

0

使用SQL Developer版本4.0.2.15 Build 15.21,可以进行以下工作:

SET SERVEROUTPUT ON
var InParam1 varchar2(100)
var InParam2 varchar2(100)
var InParam3 varchar2(100)
var OutParam1 varchar2(100)

BEGIN
    /* Assign values to IN parameters */
    :InParam1 := 'one';
    :InParam2 := 'two';
    :InParam3 := 'three';

    /* Call procedure within package, identifying schema if necessary */
    schema.package.procedure(:InParam1, :InParam2, :InParam3, :OutParam1);
    dbms_output.enable;
    dbms_output.put_line('OutParam1: ' || :OutParam1);
END;
/

不,很抱歉- var在变量不起作用之前-至少在SQL Developer 3.2.20.10中,并且不应在其前面使用冒号-至少在3.2.20.10中也不需要使用冒号(这只是我没有这样做的原因)不要对此予以否决或对其进行编辑)。之后也需要分号SET SERVEROUTPUT ON
vapcguy

0

要从仅限SQL Developer的用户运行过程,请执行以下命令

执行PROCEDURE_NAME;


-1

我无法获得@Alex Poole的答案。但是,通过反复试验,我发现以下作品(使用SQL Developer 3.0.04版)。张贴在这里,以防其他人:

SET serveroutput on;

DECLARE
    var InParam1 number;
    var InParam2 number;
    var OutParam1 varchar2(100);
    var OutParam2 varchar2(100);
    var OutParam3 varchar2(100);
    var OutParam4 number;

BEGIN
    /* Assign values to IN parameters */
    InParam1 := 33;
    InParam2 := 89;

    /* Call procedure within package, identifying schema if necessary */
    schema.package.procedure(InParam1, InParam2,
        OutParam1, OutParam2, OutParam3, OutParam4);

    /* Display OUT parameters */
    dbms_output.put_line('OutParam1: ' || OutParam1);
    dbms_output.put_line('OutParam2: ' || OutParam2);
    dbms_output.put_line('OutParam3: ' || OutParam3);
    dbms_output.put_line('OutParam4: ' || OutParam4);
END;

2
这与我的答案的第一个版本相同,只不过您已向代码块中的var每个变量添加了a declare,这是无效的。尝试运行此命令将得到“ PLS-00103:在预期下列...之一时遇到符号“ NUMBER””,并且针对其他五个变量也出现类似错误。
亚历克斯·普尔

我同意亚历克斯。投票的原因是var.package.至少在3.2.20.10中我不需要在呼叫中使用,而这本来应该没有太大的不同,但在使用时出现了错误。这个答案浪费了很多时间。
vapcguy

-1
--for setting buffer size needed most of time to avoid `anonymous block completed` message
set serveroutput on size 30000;

-- declaration block in case output need to catch
DECLARE
--declaration for in and out parameter
  V_OUT_1 NUMBER;
  V_OUT_2 VARCHAR2(200);
BEGIN

--your stored procedure name
   schema.package.procedure(
  --declaration for in and out parameter
    V_OUT_1 => V_OUT_1,
    V_OUT_2 => V_OUT_2
  );
  V_OUT_1 := V_OUT_1;
  V_OUT_2 := V_OUT_2;
  -- console output, no need to open DBMS OUTPUT seperatly
  -- also no need to print each output on seperat line 
  DBMS_OUTPUT.PUT_LINE('Ouput => ' || V_OUT_1 || ': ' || V_OUT_2);
END;

-2

如果您有许多具有许多参数的过程,则创建Pl / SQL块可能会很痛苦。有一个用python编写的应用程序可以为您完成此任务。它使用过程声明解析该文件,并创建Web应用程序以方便过程调用。


-3
var out_para_name refcursor; 
execute package_name.procedure_name(inpu_para_val1,input_para_val2,... ,:out_para_name);
print :out_para_name;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.