【问题标题】:is there a function without an input but return something是否有一个没有输入但返回一些东西的函数
【发布时间】:2020-06-28 04:18:49
【问题描述】:
CREATE OR REPLACE FUNCTION FN_MULTAS_TOTAL 
RETURN INTEGER
IS 
V_TOTAL INT;
BEGIN 
SELECT SUM(MULTA)
INTO V_TOTAL
FROM DETALLE_ARRIENDO;
RETURN V_TOTAL;
END;

我正在开发 SQL Developer 11,我必须用它来调用它

exec FN_MULTAS_TOTAL; 

并得到一个整数值

【问题讨论】:

    标签: sql oracle plsql oracle-sqldeveloper


    【解决方案1】:

    这样的功能没问题:

    SQL> create or replace function fn_multas_total
      2    return integer
      3  is
      4    v_total int;
      5  begin
      6    select sum(multa)
      7    into v_total
      8    from detalle_arriendo;
      9  return v_total;
     10  end;
     11  /
    
    Function created.
    

    但是,你不能用exec 来调用它——它用于 SQL*Plus 或 SQL Developer 或其他一些支持它的工具;它是匿名begin-end PL/SQL 块的“捷径”:

    SQL> exec p_test
    
    PL/SQL procedure successfully completed.
    
    SQL> begin
      2    p_test;
      3  end;
      4  /
    
    PL/SQL procedure successfully completed.
    

    它用于程序,而不是函数。你不能只是

    SQL> begin
      2    detalle_arriendo;
      3  end;
      4  /
      detalle_arriendo;
      *
    ERROR at line 2:
    ORA-06550: line 2, column 3:
    PLS-00221: 'DETALLE_ARRIENDO' is not a procedure or is undefined
    ORA-06550: line 2, column 3:
    PL/SQL: Statement ignored
    
    
    SQL>
    

    这意味着您必须声明一个变量并将函数的结果提取到其中,例如

    SQL> declare
      2    l_result number;
      3  begin
      4    l_result := fn_multas_total;
      5  end;
      6  /
    
    PL/SQL procedure successfully completed.
    
    SQL>
    

    通常,我们使用函数作为

    SQL> select fn_multas_total from dual;
    
    FN_MULTAS_TOTAL
    ---------------
                100
    
    SQL>
    

    如果你拼命想使用exec,那么你还是要声明一个变量并且

    SQL> var result number
    SQL> exec :result := fn_multas_total;
    
    PL/SQL procedure successfully completed.
    
    SQL> print :result
    
        RESULT
    ----------
           100
    
    SQL>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-15
      • 2021-08-06
      • 2016-09-25
      • 1970-01-01
      • 2018-08-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多