Может ли оператор Sql быть инкапсулирован в подфункцию для лучшей читаемости? - PullRequest
1 голос
/ 08 марта 2011

Я пытаюсь реализовать табличную функцию, следуя примеру Тони Эндрюса .Но мой оператор Sql будет состоять из нескольких строк (> 20) и также будет содержать параметры.Можно ли инкапсулировать оператор Sql где-то еще и ссылаться на него из основной функции, чтобы сделать все более читабельным?

В традиционных языках программирования я бы назначил сырой Sql в строку и заменил бы параметры по мере необходимости.

Ответы [ 2 ]

3 голосов
/ 09 марта 2011

Да, вы можете:

--declare variables
TYPE curref is REF CURSOR;
c1 curref;

q VARCHAR2(2000);

--save query to string variable
q:='<insert 20 line query here>';

--open cursor 
OPEN c1 FOR q;

--then, work on cursor rows, one by one

Заметьте, что 'q' может быть довольно сложным, с объединенными значениями параметров (или подзапросами, которые могут быть сохранены как отдельные переменные varchar):

q:='
    select distinct
        fn.BASENAME as name
        ,h.PARENT_ID as "admin_place_id"
        ,h.lev as "admin_level"
    FROM (
        SELECT CHILD_ID, PARENT_ID, level lev
        from '||schema||'.NT_ADMIN_GRAPH
        START WITH CHILD_ID='||q_sub2||'
        CONNECT BY CHILD_ID=PRIOR PARENT_ID
    UNION ALL
        SELECT null, '||q_sub2||', 0
        FROM DUAL
    ) h
    '
    ||q_sub||
    '
    ORDER BY h.lev asc    
';

См. документацию Oracle для получения дополнительных примеров того, как реализовать это.

1 голос
/ 09 марта 2011

Вдохновлен drapkin11. Я нашел решение с помощью курсора:

CREATE OR REPLACE Function TotalIncome( name_in IN varchar2 )
RETURN varchar2
IS
    total_val number(6);

    cursor c1 is
      select monthly_income
      from employees
      where name = name_in;

BEGIN
    total_val := 0;
    FOR employee_rec in c1
    LOOP
        total_val := total_val + employee_rec.monthly_income;
    END LOOP;
    RETURN total_val;
END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...