Функция PL / SQL, которая принимает весь столбец в качестве аргумента - PullRequest
0 голосов
/ 28 декабря 2018

Мне нужно написать функцию 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.

Итак, как мне написать функцию, которая вычисляет и возвращает значение на основе всего столбцаХ, а не последовательно по его рядам?

Ответы [ 2 ]

0 голосов
/ 28 декабря 2018

Если вы не хотите агрегировать, вы можете использовать максимальное окно / аналитическую функцию, чтобы вернуть для каждой строки общее максимальное значение: -

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

Которое в вашем примере вернет 5,5, 5,5,5

Не знаете, зачем вам нужен вызов PL / SQL (и переключение контекста)?

0 голосов
/ 28 декабря 2018

Да, я не уверен, что понял, что вы говорите, тем более что кажется, что параметр функции имеет тип данных NUMBER.

Я думаю , что вы хотите передать имя столбца (что означает, что тип данных параметра должен быть VARCHAR2) и получить его значение MAX из некоторой таблицы (которую нельзя передаватьв качестве параметра).Если это так, динамический SQL может помочь.Вот пример, основанный на схеме Скотта:

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>

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...