85

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

如果我右键单击,菜单项是“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:

根据亚历克斯的回答,我尝试从参数前面删除冒号并得到这个:

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:
4

15 回答 15

78

使用简单的参数类型(即不是 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;
于 2010-10-21T21:45:19.527 回答
30

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

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

它的摘要是这样的。

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

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

var r refcursor;
exec mypackage.getquestions(:r, 'OMG Ponies');
print r;
于 2010-10-21T20:48:09.547 回答
22

对于那些使用 SqlDeveloper 3+ 的人,如果你错过了:

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

只需右键单击package/stored proc/stored 函数,点击Run并选择target要执行的proc/func,SqlDeveloper 会生成代码片段来执行(这样你就可以输入你的输入参数)。执行后,输出参数显示在对话框的下半部分,甚至还内置了对 ref cursor 的支持: cursor 的结果将显示为单独的输出选项卡。

于 2015-06-03T06:37:36.753 回答
14

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

BEGIN
  PROCEEDURE_NAME_HERE();
END;
于 2012-01-05T20:42:25.500 回答
7

采用:

BEGIN

  PACKAGE_NAME.PROCEDURE_NAME(parameter_value, ...);

END;

将“PACKAGE_NAME”、“PROCEDURE_NAME”和“parameter_value”替换为您需要的内容。OUT 参数需要事先声明。

于 2010-10-21T20:49:07.090 回答
2

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

所有这些问题都让我摸不着头脑,而这些答案有这些令人震惊的错误被拿出来,涂上焦油和羽毛。

于 2016-08-30T21:12:18.250 回答
2

尽管这个问题已经很老了,但我一直跌跌撞撞地遇到相同的结果,却没有找到从 sql developer 运行的简单方法。经过几次尝试,我找到了一种从 sql developer 本身执行存储过程的简单方法。

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

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

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

于 2018-03-13T18:46:51.927 回答
1

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

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

于 2013-07-02T13:10:35.743 回答
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;
/
于 2014-07-25T20:04:01.737 回答
0

要从仅限 SQL 开发人员运行程序,请执行以下命令

执行程序名称;

于 2020-04-16T08:03:50.490 回答
0

我有一个返回游标的存储过程,在我的情况下,它实际上是一个自定义包类型(T_CURSOR,对我来说看起来像一个约定),它被定义为REF CURSOR.

可能有更好的方法来做到这一点,但我为游标迭代的表的所有列定义了变量,循环游标将每一行提取到这些变量中,然后将它们打印出来。

SET serveroutput on;
DECLARE
  testvar number;
  v_cur  SYS_REFCURSOR;
  ORIGINAL_EMP_NUM  NUMBER;
  TEMPORARY_EMP_NUM NUMBER;
  ORG_UNIT_CODE VARCHAR2(2 BYTE);
  MRU_CODE  VARCHAR2(10 BYTE);
  CTRL_COMPANY_CODE VARCHAR2(10 BYTE);
  IS_TEMP_FLAG  VARCHAR2(1 BYTE);
BEGIN
  testvar := 420;
  foo.updates.get_temporary_authorisations(testvar, v_cur);
  dbms_output.enable;
  dbms_output.put_line(testvar);
  
  LOOP
    FETCH v_cur INTO ORIGINAL_EMP_NUM, TEMPORARY_EMP_NUM, ORG_UNIT_CODE, MRU_CODE, CTRL_COMPANY_CODE, IS_TEMP_FLAG;
    EXIT WHEN v_cur%NOTFOUND;
    dbms_output.put_line(ORIGINAL_EMP_NUM || ',' || TEMPORARY_EMP_NUM || ',' || ORG_UNIT_CODE || ',' || MRU_CODE|| ',' || CTRL_COMPANY_CODE|| ',' || IS_TEMP_FLAG);
  END LOOP;
  CLOSE v_cur;
END;
于 2021-10-26T05:36:48.847 回答
-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;
于 2013-09-21T19:01:43.703 回答
-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;
于 2019-05-30T04:16:06.873 回答
-2

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

于 2015-12-11T15:25:34.613 回答
-3
var out_para_name refcursor; 
execute package_name.procedure_name(inpu_para_val1,input_para_val2,... ,:out_para_name);
print :out_para_name;
于 2012-09-05T19:29:46.913 回答