以整列为参数的PL / SQL函数

时间:2018-12-28 20:25:17

标签: sql oracle function plsql

我需要编写一个PL / SQL函数,该函数计算一个值,该值取决于列中的所有元素。

例如,假设我有一个X列,其数字为1、2、3、4、5。我想编写一个函数,以该列为参数并返回最大值,这样

SELECT FUN(X) FROM SOME_TABLE

返回值为5、5、5、5、5的列。

以一种简单的方式来解决这个问题,可以这样写:

CREATE OR REPLACE FUNCTION MMMAX (X NUMBER)
  RETURN NUMBER
IS
  Y NUMBER;
BEGIN
  SELECT MAX(X) INTO Y FROM DUAL;
  RETURN Y;
END;

尽管这样,一个函数不会将整个列用作参数。在此示例中,它将按顺序将MAX(X)应用于X的每一行,而不是在整个X列中找到最大值。

那么,我该如何编写一个函数来计算并返回基于整个X列的值,而不是基于其X行的顺序?

2 个答案:

答案 0 :(得分:4)

嗯,我不确定我是否理解您的意思,尤其是当函数的参数似乎是NUMBER数据类型时。

认为您想传递列名(这意味着参数的数据类型应为VARCHAR2)并从某个表中获取其MAX值(而不是作为参数传递)。如果是这样,动态SQL可能会有所帮助。这是一个基于Scott模式的示例:

SQL> create or replace function f_max (par_column_name in varchar2)
  2    return varchar2
  3  is
  4    l_out varchar2(200);
  5  begin
  6    execute immediate 'select max(' || par_column_name ||
  7                      ') from emp' into l_out;
  8    return l_out;
  9  end;
 10  /

Function created.

对此示例数据进行测试:

SQL> select deptno, ename, sal from emp;

    DEPTNO ENAME             SAL
---------- ---------- ----------
        20 SMITH             800
        30 ALLEN            1600
        30 WARD             1250
        20 JONES            2975
        30 MARTIN           1250
        30 BLAKE            2850
        10 CLARK            2450
        10 KING             5000
        30 TURNER           1500
        30 JAMES             950
        20 FORD             3000
        10 MILLER           1300
        20 SCOTT            3000
        20 ADAMS            1100

14 rows selected.

功能结果:

SQL> select f_max('deptno') result from dual;

RESULT
--------------------------------------------------
30

SQL> select f_max('ename')  result from dual;

RESULT
--------------------------------------------------
WARD

SQL> select f_max('sal')    result from dual;

RESULT
--------------------------------------------------
5000

SQL>

希望对您有帮助。

答案 1 :(得分:0)

如果您不想汇总,则可以使用max window / analytic函数来为每一行返回总体最大值:-

select max (x) over (partition by null) from some_table

在您的示例中,哪个将返回5,5,5,5,5

不确定为什么要进行PL / SQL调用(和上下文切换)吗?