是否有没有输入但返回某些内容的函数

0 sql oracle plsql oracle-sqldeveloper

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;
Run Code Online (Sandbox Code Playgroud)

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

exec FN_MULTAS_TOTAL; 
Run Code Online (Sandbox Code Playgroud)

并获得一个整数值

Lit*_*oot 5

这样的功能没问题:

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.
Run Code Online (Sandbox Code Playgroud)

但是,您不会将其称为exec- 它在 SQL*Plus 或 SQL Developer 或其他支持它的工具中使用;它是匿名begin-endPL/SQL 块的“快捷方式” :

SQL> exec p_test

PL/SQL procedure successfully completed.

SQL> begin
  2    p_test;
  3  end;
  4  /

PL/SQL procedure successfully completed.
Run Code Online (Sandbox Code Playgroud)

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

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>
Run Code Online (Sandbox Code Playgroud)

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

SQL> declare
  2    l_result number;
  3  begin
  4    l_result := fn_multas_total;
  5  end;
  6  /

PL/SQL procedure successfully completed.

SQL>
Run Code Online (Sandbox Code Playgroud)

通常,我们使用函数作为

SQL> select fn_multas_total from dual;

FN_MULTAS_TOTAL
---------------
            100

SQL>
Run Code Online (Sandbox Code Playgroud)

如果您非常想使用exec,那么您仍然必须声明一个变量并

SQL> var result number
SQL> exec :result := fn_multas_total;

PL/SQL procedure successfully completed.

SQL> print :result

    RESULT
----------
       100

SQL>
Run Code Online (Sandbox Code Playgroud)