我需要编写一个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行的顺序?
答案 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调用(和上下文切换)吗?