在SQL Developer中运行存储过程?

在SQL Developer中运行存储过程?

问题描述:

我想运行一个存储过程,有多个进出参数。该过程只能通过导航其他用户|在我的“连接”面板中查看|包| | |在SQL Developer中运行存储过程?

如果我右键单击,菜单项是“Order Members By ...”和“Create Unit Test”(灰色)。用户访问该程序时,“运行”该程序的功能似乎不可行。

我一直在试图找到一个如何创建一个匿名块的例子,以便我可以作为一个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 

我已经试过初始化出*变量:

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: 
+0

[最好的方法/工具从oracle包过程中得到结果]的可能的重复(http://*.com/questions/3526798/best-way-tool-to-get-the-results-from- an-oracle-package-procedure) – 2010-10-21 20:52:33

+0

尝试在过程执行语句之前将OUT变量放入BEGIN中。 – 2010-10-21 21:56:00

+0

你不需要'execute';在PL/SQL中被解释为'execute immediate'的开始,这与SQL'execute'不同。 – 2010-10-21 22:08:41

使用简单的参数类型(即不包括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好的答案。出于好奇,你知道哪个是首选? – 2010-10-21 23:05:39

+0

@康拉德:我想它是一个偏好的事情,尽管可能有更多的上下文切换':var'的方式。如果我对PL/SQL做任何事情,我会默认使用'declare'方式;但是如果我正在使用从Pro * C复制的已有代码中已有的语法,并且我不想在调用中触摸parms,那么我可以使用':var'。 – 2010-10-22 06:41:02

+1

感谢您的帮助和详细的答案。我相信这对别人也是一种帮助。有一点要注意的是,这些必须作为脚本而不是语句运行。 – sdoca 2010-10-22 16:15:12

执行简单。获得结果可能很困难。

看看这个问题,我问Best way/tool to get the results from an oracle package procedure

它的总结是这样的。

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

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

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

我不得不使用完整的单词“执行”而不是“执行” – Patrick 2014-11-21 23:01:25

用途:

BEGIN 

    PACKAGE_NAME.PROCEDURE_NAME(parameter_value, ...); 

END; 

替换 “PACKAGE_NAME”, “PROCEDURE_NAME” 和 “PARAMETER_VALUE” 你需要什么。 OUT参数需要在之前声明。

打开过程中的SQL开发人员并从那里运行它。 SQL Developer显示它运行的SQL。

BEGIN 
    PROCEEDURE_NAME_HERE(); 
END; 

var out_para_name refcursor; 
execute package_name.procedure_name(inpu_para_val1,input_para_val2,... ,:out_para_name); 
print :out_para_name; 

不能相信,这不会在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

[执行]命令的[SQL * Plus文档]声明。这不是对问题的回答,尽管已经被问到了,并且已经在[无论如何在其他问题的更多相关答案](http://*.com/a/15649958/266304)中被覆盖。 – 2013-07-05 10:55:00

+0

能够在SQL Developer中使用它。谢谢 – Sergejs 2015-09-16 09:18:15

我无法获得@Alex Poole a nswers工作。但是,通过试验和错误,我发现了以下工作(使用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

这与我答案中的第一个版本相同,只是你在'declare'块中的每个变量中添加了一个'var',这是无效的。尝试运行此命令会产生'PLS-00103:遇到下列其中一个...时出现符号“NUMBER”,并且与其他五个变量相似的错误。 – 2013-11-20 13:24:12

+0

我同意亚历克斯。因为'var',因此我不需要在我的调用中使用'.package.',至少在3.2.20.10中应该不会这么差,并且当我这样做时会出错。用这个答案浪费了很多时间。 – vapcguy 2016-08-30 21:22:03

使用SQL Developer版本4.0.2.15构建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; 
/
+0

不,对不起, - var之前变量不起作用 - 至少在SQL Developer 3.2.20.10中,不应该在它们前面使用冒号 - 不需要它,至少在3.2.20.10(唯一的原因是我没有投票或编辑它)。 'SET SERVEROUTPUT ON'后也需要一个分号。 – vapcguy 2016-08-30 21:17:59

对于使用的SQLDeveloper 3+这些,如果你错过了:

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

在包/存储过程/存储功能,只需右键点击,点击Run并选择target是PROC/FUNC要执行,的SQLDeveloper将生成的代码片段执行(这样你可以把你的输入参数)。一旦执行,输出参数将显示在对话框的下半部分,甚至内置了对参考光标的支持:光标结果将显示为单独的输出选项卡。

+0

这应该是选定的答案。 – EvilTeach 2017-06-14 19:36:24

如果你有很多程序有很多参数,创建PI/SQL块会很痛苦。有一个application写在python上,为你做。 它使用过程声明解析文件并创建Web应用程序以便于过程调用。

这些其他答案都不适合我。这是我必须做在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声明变量

所有这些问题都留给我抓我的头最长和这些答案有这些令人震惊的错误出要取出,柏油羽毛。