【问题标题】:Run Stored Procedure in SQL Developer?在 SQL Developer 中运行存储过程?
【发布时间】:2011-04-28 20:23:05
【问题描述】:

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

如果我右键单击,菜单项是“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 的回答,我尝试从参数前面删除冒号并得到以下信息:

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:

【问题讨论】:

  • 尝试将 OUT 变量放在 BEGIN 中,在过程执行语句之前。
  • 你不需要execute;在 PL/SQL 中被解释为 execute immediate 的开头,这与 SQL execute 不同。
  • @sdoca:你现在混淆了两种方法;使用您的编辑 2 版本,只需删除单词 execute。 declare 应该在 begin 之前。我认为@OMG 的意思是你可以在SQL Developer 中使用variable 关键字在匿名块之前声明变量,然后像原来一样使用:out1 语法,在这种情况下你没有declare 部分。但是您将上次评论中的两者混为一谈。
  • 是的,我知道我很困惑,但不太确定在哪里/如何。

标签: oracle stored-procedures oracle-sqldeveloper


【解决方案1】:

我有一个返回游标的存储过程,在我的例子中,它实际上是自定义包类型(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;

【讨论】:

    【解决方案2】:

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

    执行程序名称;

    【讨论】:

    • “缺少 SELECT 关键字”错误
    【解决方案3】:
    --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;
    

    【讨论】:

      【解决方案4】:

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

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

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

      我使用的是 SQL 开发者版本 4.1.3.20

      【讨论】:

        【解决方案5】:

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

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

          【讨论】:

            【解决方案7】:

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

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

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

            【讨论】:

            • 这应该是选择的答案。
            【解决方案8】:

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

            【讨论】:

            • 不,抱歉 -- var 在变量不起作用之前 - 至少在 SQL Developer 3.2.20.10 中,并且不应该在它们前面使用冒号 - 再次不需要它,至少在 3.2.20.10 中(唯一的原因是我没有投票反对或编辑它)。在SET SERVEROUTPUT ON 之后还需要一个分号。
            【解决方案9】:

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

            【讨论】:

            • 这与我的答案中的第一个版本相同,除了您在declare 块中的每个变量中添加了一个var,这是无效的。尝试运行它会给出“PLS-00103:在预期以下之一时遇到符号“NUMBER”......”,以及其他五个变量的类似错误。
            • 我同意亚历克斯的观点。因为var 被否决了,而且我不需要在我的通话中使用.package.,至少在3.2.20.10 中,这不应该如此不同,并且在我这样做时出错了。这个答案浪费了很多时间。
            【解决方案10】:

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

            显然,一切都必须在一行中..

            【讨论】:

            • [execute 命令的 SQL*Plus 文档] 说明了这一点。不过,这不是对所提问题的回答,无论如何,in more relevant answers to other questions 之前已经讨论过。
            • 能够在 SQL Developer 中使用它。谢谢
            【解决方案11】:
            var out_para_name refcursor; 
            execute package_name.procedure_name(inpu_para_val1,input_para_val2,... ,:out_para_name);
            print :out_para_name;
            

            【讨论】:

              【解决方案12】:

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

              BEGIN
                PROCEEDURE_NAME_HERE();
              END;
              

              【讨论】:

                【解决方案13】:

                使用简单的参数类型(即不是 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 不错的答案。出于好奇,您知道哪个是首选吗?
                • @Conrad:我想这是一种偏好,尽管可能会有更多的上下文切换:var 方式。如果我使用 PL/SQL 做任何事情,我会默认使用 declare 方式;但是我可能会使用:var,例如,如果我使用的是从 Pro*C 复制的一些现有代码,这些代码已经具有该语法并且我不想在调用中触及参数。
                • 感谢您的帮助和详细的回答。我相信这也会对其他人有所帮助。需要注意的一件事是这些必须作为脚本而不是语句运行。
                • 在sql developer中运行时,我不必在变量名前加上:(实际上并没有用)。
                【解决方案14】:

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

                看看我问的这个问题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;
                

                【讨论】:

                • 我不得不使用完整的单词“execute”而不是“exec”
                【解决方案15】:

                用途:

                BEGIN
                
                  PACKAGE_NAME.PROCEDURE_NAME(parameter_value, ...);
                
                END;
                

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

                【讨论】:

                  猜你喜欢
                  • 2013-12-09
                  • 2021-12-01
                  • 2011-03-09
                  • 2011-11-11
                  • 2023-03-04
                  • 2011-05-07
                  • 2020-04-13
                  • 2012-05-16
                  • 1970-01-01
                  相关资源
                  最近更新 更多