我正在尝试运行具有多个输入和输出参数的存储过程。只能通过导航其他用户|在我的“连接”面板中查看该过程|包裹| |
如果我右键单击,菜单项为“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
我尝试初始化out *变量:
out1 VARCHAR2(100) := '';
但得到同样的错误:
编辑2:
根据亚历克斯的回答,我尝试从params前面删除冒号并得到这个:
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 :(得分:71)
使用简单的参数类型(即不是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 :(得分:25)
执行简单。获得结果可能很难。
看看我问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;
答案 2 :(得分:16)
对于那些使用SqlDeveloper 3+的人,如果你错过了:
SqlDeveloper具有直接执行存储过程/功能的功能,输出以易于阅读的方式显示。
右键单击包/存储过程/存储函数,单击Run
并选择target
作为要执行的proc / func,SqlDeveloper将生成要执行的代码片段(这样你就可以输入你的输入参数了。执行后,输出参数显示在对话框的下半部分,甚至内置支持ref cursor:光标结果将显示为单独的输出选项卡。
答案 3 :(得分:11)
在SQL Developer中打开该过程并从那里运行它。 SQL Developer显示它运行的SQL。
BEGIN
PROCEEDURE_NAME_HERE();
END;
答案 4 :(得分:6)
使用:
BEGIN
PACKAGE_NAME.PROCEDURE_NAME(parameter_value, ...);
END;
将“PACKAGE_NAME”,“PROCEDURE_NAME”和“parameter_value”替换为您需要的内容。 OUT参数需要在。之前声明。
答案 5 :(得分: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
声明变量所有这些问题都让我摸不着头脑,这些答案中出现了这些令人震惊的错误,这些错误会被取出并涂焦油和羽毛状。
答案 6 :(得分:1)
虽然这个问题已经很老了,但我仍然没有找到一个从sql开发人员那里轻松运行的方法。 经过几次尝试,我找到了一种从sql developer本身执行存储过程的简单方法。
在包下,选择所需的包,然后右键单击包名(而不是存储过程名)。
您会找到要运行的选项。选择它并提供所需的参数。单击确定,您可以在
我正在使用SQL开发人员版本4.1.3.20
答案 7 :(得分: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;
显然一切都必须在一行..
答案 8 :(得分: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;
/
答案 9 :(得分:0)
要从仅限SQL Developer的用户运行过程,请执行以下命令
EXECUTE PROCEDURE_NAME;
答案 10 :(得分:-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;
答案 11 :(得分:-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;
答案 12 :(得分:-2)
如果您有许多具有大量参数的过程,那么创建Pl / SQL块会很痛苦。在python上写了一个application来为你做。 它使用过程声明解析文件,并创建Web应用程序以方便过程调用。
答案 13 :(得分:-3)
var out_para_name refcursor;
execute package_name.procedure_name(inpu_para_val1,input_para_val2,... ,:out_para_name);
print :out_para_name;