Знаете, чего я терпеть не могу? Когда разработчик утверждает, что Transact SQL
лучше PL/SQL
— и приводит некий аспект, который действительно лучше. Обычно я начинаю доказывать, что PL/SQL
на голову выше Transact SQL
... но в конце концов, у каждого языка есть свои сильные и слабые стороны, а в Transact SQL уже давно поддерживается возможность создания процедур, которые просто выводят стандарт результирующего набора на экран. В PL/SQL до недавнего времени приходилось писать запрос, перебирать результирующий набор и вызывать DBMS_OUTPUT.PUT_LINE
для отображения результатов.
Однако теперь эта функциональность появилась и в PL/SQL
. Это добавление ориентировано в первую очередь на разработчиков, переходящих с Transact SQL
на PL/SQL
(добро пожаловать!), а также предназначено для тестирования (стало намного проще написать короткую процедуру для вывода содержимого таблицы).
В Oracle данная возможность реализуется расширением функциональности пакета DBMS_SQL
. Ура! Еще одна причина не отказываться от проверенного временем пакета (который во многом потерял актуальность из-за NDS
).
Допустим, я хочу вывести фамилии всех работников заданного отдела. Для этого можно написать следующую процедуру:
CREATE OR REPLACE PROCEDURE show_emps (
department_id_in IN employees.department_id%TYPE)
IS
l_cursor SYS_REFCURSOR;
BEGIN
OPEN l_cursor FOR
SELECT last_name
FROM employees
WHERE department_id = department_id_in ORDER BY last_name;
DBMS_SQL.return_result (l_cursor);
END;
/
Если выполнить ее в SQL*Plus
для отдела с идентификатором 20, получим:
BEGIN
show_emps (20);
END;
/
PL/SQL procedure successfully completed.
ResultSet #1
LAST NAME
----------
Fay
Hartstein
Вы также можете воспользоваться процедурой DBMS_SQL.GET_NEXT_RESULT
для получения следующего результата, возвращаемого вызовом RETURN_RESULT
, в программе PL/SQL
(вместо того, чтобы передавать его во внешнюю среду).