oracle存储过程调用sql文件,oracle - 在SQL Developer中运行存储过程?
发布日期:2021-06-24 14:52:35 浏览次数:3 分类:技术文章

本文共 5962 字,大约阅读时间需要 19 分钟。

oracle - 在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

我已经尝试初始化out *变量:

out1 VARCHAR2(100) := '';

但得到同样的错误:

编辑2:

根据Alex的回答,我尝试从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:

12个解决方案

71 votes

使用简单的参数类型(即不是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;

Alex Poole answered 2019-06-22T23:24:51Z

24 votes

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

看看这个问题我问了最好的方法/工具来从oracle包程序中获取结果

它的摘要是这样的。

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

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

var r refcursor;

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

print r;

Conrad Frix answered 2019-06-22T23:25:42Z

15 votes

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

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

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

Adrian Shum answered 2019-06-22T23:26:20Z

10 votes

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

BEGIN

PROCEEDURE_NAME_HERE();

END;

Noel answered 2019-06-22T23:26:44Z

5 votes

使用:

BEGIN

PACKAGE_NAME.PROCEDURE_NAME(parameter_value, ...);

END;

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

OMG Ponies answered 2019-06-22T23:27:11Z

1 votes

这些其他答案都不适合我。 这是我在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)。

注意(与我和其他人的差异):

变量名称前面没有var

模式名称和过程名称之间没有放置var或.packages.

无需将var放入变量的值中。

没有在任何地方使用var

不使用var来声明变量

所有这些问题都让我摸不着头脑,这些答案中出现了这些令人难以置信的错误,并且被涂上了焦油和羽毛。

vapcguy answered 2019-06-22T23:28:31Z

0 votes

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

显然一切都必须在一条线上..

Amel Music answered 2019-06-22T23:29:09Z

0 votes

使用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;

/

Jack answered 2019-06-22T23:29:34Z

0 votes

虽然这个问题已经很老了,但我仍然没有找到一个从sql开发人员那里轻松运行的方法。   经过几次尝试,我找到了一种从sql developer本身执行存储过程的简单方法。

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

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

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

Narasimha answered 2019-06-22T23:30:20Z

-1 votes

我无法得到@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;

ggkmath answered 2019-06-22T23:30:45Z

-2 votes

如果您有许多具有大量参数的过程,那么创建Pl / SQL块会很痛苦。 有一个在python上编写的应用程序可以帮到你。它使用过程声明解析文件,并创建Web应用程序以方便过程调用。

nmax answered 2019-06-22T23:31:10Z

-3 votes

var out_para_name refcursor;

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

print :out_para_name;

Helper answered 2019-06-22T23:31:28Z

转载地址:https://blog.csdn.net/weixin_33458486/article/details/116344297 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:oracle同时报604和12507,V$SES_OPTIMIZER_ENV 查不到刚修改的隐含参数,
下一篇:android pm.java,java – AM / PM的Android DateFormat因设备而异

发表评论

最新留言

关注你微信了!
[***.104.42.241]2024年04月13日 04时20分41秒