在SQL Developer中运行存储过程?
我试图运行一个有多个参数和参数的存储过程。 该过程只能通过导航其他用户|在我的“连接”面板中查看 | 包| |
如果我右键单击,菜单项是“订单成员…”和“创buildunit testing”(灰色)。 当用户访问时,“运行”程序的能力似乎不可能。
我一直在试图find一个如何创build一个匿名块的例子,以便我可以作为一个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 *variables:
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:
使用简单的参数types(即不是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
绑定variables:
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;
执行简单。 获得结果可能很难。
看看这个问题,我问最好的方式/工具来从一个oracle包过程中得到的结果
它的总结是这样的。
假设你有一个名为mypackage的包和一个名为getQuestions的过程。 它返回一个refcursor并接受string用户名。
所有你需要做的是创build新的SQL文件(文件新)。 设置连接并粘贴到下面并执行。
var r refcursor; exec mypackage.getquestions(:r, 'OMG Ponies'); print r;
在SQL Developer中打开过程并从那里运行它。 SQL Developer显示它运行的SQL。
BEGIN PROCEEDURE_NAME_HERE(); END;
对于那些使用SqlDeveloper 3+,如果你错过了:
SqlDeveloper具有直接执行存储过程/函数的function,输出以易于阅读的方式显示。
只需右键单击包/存储过程/存储函数,单击Run
,selecttarget
是要执行的proc / func,SqlDeveloper将生成要执行的代码片段(以便您可以将您的input参数)。 一旦执行完成,输出参数将显示在对话框的下半部分,甚至内置了对参考光标的支持:光标结果将显示为单独的输出选项卡。
使用:
BEGIN PACKAGE_NAME.PROCEDURE_NAME(parameter_value, ...); END;
用你所需要的replace“PACKAGE_NAME”,“PROCEDURE_NAME”和“parameter_value”。 OUT参数需要在之前声明。
这些其他答案都没有为我工作。 以下是我在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是如何处理这个传入的variables的 – 输出结果只是确认variables接收到了这个值(理论上,它传递给了proc)。
注意 (与我的不同之处):
- 否
:
在variables名称之前 - 没有把
.package.
或.packages.
模式名称和过程名称之间 - 不必在variables的值中join
&
。 - 没有使用任何地方
print
- 没有使用
var
来声明variables
所有这些问题都让我搔了搔脑筋,而这些答案也带有这些令人毛骨悚然的错误。
不能相信,这将不会在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;
显然,一切都必须在一行
使用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; /
我无法获得@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;
如果你有很多程序有很多的参数,创buildPI / SQL块会很痛苦。 有一个应用程序写在python上,为你做。 它使用过程声明来parsing文件,并创buildWeb应用程序以便于程序调用。
var out_para_name refcursor; execute package_name.procedure_name(inpu_para_val1,input_para_val2,... ,:out_para_name); print :out_para_name;