【问题标题】:can we call procedure inside a function in PL/SQL? [closed]我们可以在 PL/SQL 中的函数内部调用过程吗? [关闭]
【发布时间】:2012-03-31 23:58:45
【问题描述】:

我们可以在过程内部调用函数,但是可以在函数内部调用过程吗? 我试过了,但我不能在函数内调用过程。 你能告诉我为什么我们不能在函数内部调用过程吗?

【问题讨论】:

标签: oracle function stored-procedures plsql oracle10g


【解决方案1】:

" 我试过了,但我不能在函数内部调用过程。"

你是怎么尝试的?你尝试了什么?你在什么方面失败了?

因为允许在函数内部调用过程。因此,如果它对您不起作用,那么原因是您的代码中有问题。如果您不提供比您目前拥有的更多的信息,我们就无法诊断出这一点。

两个最可能的原因是:

  1. 您的代码中存在语法错误,导致无法编译,或者存在其他引发运行时异常的错误。

  2. 函数可能在过程范围内,但反之则不然。

  3. 当我们在查询中调用函数(例如发出 DML)并且您在 SELECT 语句中调用函数时,您的过程正在执行不允许的操作。

【讨论】:

    【解决方案2】:

    我在这里猜测一下,您首先声明了函数,过程如下,类似于:

    DECLARE
      FUNCTION my_func RETURN NUMBER IS
      BEGIN
        RETURN 2;
      END my_func;
    
      PROCEDURE my_proc IS
      BEGIN
        DBMS_OUTPUT.PUT_LINE(my_func + 1);
      END my_proc;
    
    BEGIN  -- main
      my_proc;
    END;    -- main
    

    如上所示,首先声明函数后,您可以从过程中调用该函数。但是,如果您尝试以下操作(函数在过程之前声明,并且函数调用过程):

    DECLARE
      FUNCTION my_func RETURN NUMBER IS
      BEGIN
        my_proc;
        RETURN 2;
      END my_func;
    
      PROCEDURE my_proc IS
      BEGIN
        DBMS_OUTPUT.PUT_LINE('22');
      END my_proc;
    
    BEGIN  -- main
      DBMS_OUTPUT.PUT_LINE(my_func);
    END;    -- main
    

    编译将失败,因为 my_func 无法“看到”my_proc。要使其工作,您需要在 my_proc 中添加一个“原型”声明,如下所示:

    DECLARE
      PROCEDURE my_proc;
    
      FUNCTION my_func RETURN NUMBER IS
      BEGIN
        my_proc;
        RETURN 2;
      END my_func;
    
      PROCEDURE my_proc IS
      BEGIN
        DBMS_OUTPUT.PUT_LINE('22');
      END my_proc;
    
    BEGIN  -- main
      DBMS_OUTPUT.PUT_LINE(my_func);
    END;    -- main
    

    分享和享受。

    【讨论】:

    • 我通常会尽量避免前向声明,因为这意味着两组签名必须保持同步而没有明显的好处。以正确的顺序组织子程序通常更容易。除非它是一个非常大的包,但即便如此,分解也许是更好的主意。
    • @APC - 我同意前向声明可能会产生一些问题,但在这种情况下,我建议使用一个作为所提出问题的可能解决方案,因为它似乎适合 OP 遇到的问题。 YMMV。
    【解决方案3】:

    我猜你正在使用call procexec proc。下面是一个如何调用过程的例子。

    CREATE OR REPLACE function f() return number as
    BEGIN
      your_proc;
      another_proc_with_param(2, 'John');
      return 0;
    EXCEPTION when others then return -1;
    END f;
    

    但是,如果您的函数(或您的函数调用的过程)执行 DML,则您的函数不能在 sql 语句中使用。(只能在 PLSQL 块中使用)。

    【讨论】:

      【解决方案4】:
      create or replace function test_fun(id in number) return number 
      as 
      val number;
      begin 
      get_data(id,val);
      return val;
      end;
      
      create or replace procedure get_data(a in number ,b out number)
      as
      id number; 
      begin
      b:=a*a;
      end;
      

      【讨论】:

      • 这是在函数中调用过程的例子
      • 欢迎来到 Stack Overflow!虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您正在为将来的读者回答问题,而这些人可能不知道您的代码建议的原因。也请尽量不要用解释性的 cmets 挤满你的代码,这会降低代码和解释的可读性!
      【解决方案5】:

      --------------函数内部的过程------ ------------

      create or replace function f_2  return date as
      
      begin
      
      declare
      
      today_date date;
      
      x number; 
      

      --------程序声明-----

      procedure pro_3(d_date out date )
      
      is
      
      begin
      
      d_date:=sysdate;
      
      end pro_3;
      
      BEGIN 
      

      ---------调用的过程--------

      pro_3(today_date);
      
      for x in 1..7 LOOP 
      
      IF TO_CHAR(today_date,'FMDAY')='SUNDAY' THEN 
      
      GOTO label_name; 
      
      END IF; 
      
      today_date:=today_date+1; 
      
      END LOOP; 
      
      <<label_name>> 
      
      DBMS_OUTPUT.PUT_LINE(TO_CHAR(today_date,'DAY')||today_date);
      
      end;
      
      DBMS_OUTPUT.PUT_LINE('today is  ' ||TO_CHAR(sysdate,'DAY'));
      
      return sysdate;
      
      end;
      

      ----------------------执行------------ ---------------------

      exec dbms_output.put_line(f_2);
      

      【讨论】:

        猜你喜欢
        • 2010-10-09
        • 1970-01-01
        • 2012-03-04
        • 2012-07-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多