Да. Вы можете вызвать любую программу pl / sql из любой другой программы pl / sql. Функция может вызывать функцию, процедура может вызывать процедуру, которая вызывает функцию, функция может вызывать ТИП ТЕЛА ... сделать ВСТАВКУ ... которая вызывает срабатывание ТРИГГЕРА.
Простой (не очень практичный) пример.
Использование схемы HR, где у вас есть таблица EMPLOYEES, которая включает столбцы EMPLOYEE_ID, FIRST_NAME и LAST_NAME.
У меня есть функция, которая принимает INTEGER, который мы используем для поиска записи EMPLOYEE. Мы берем их имена и фамилии, объединяем их вместе и возвращаем значение обратно в тексте UPPERCASE.
Однако перед тем, как мы это сделаем, мы вызываем процедуру, которая делает только 5-секундный сон с использованием пакета DBMS_LOCK.
код:
create or replace procedure do_nothing_comments (x in integer, y in integer)
is
begin
null;
-- yeah, this is a dumb demo
dbms_lock.sleep(5);
end;
/
create or replace FUNCTION upper_name (
x IN INTEGER
) RETURN VARCHAR2 IS
upper_first_and_last VARCHAR2 (256);
BEGIN
SELECT upper (first_name)
|| ' '
|| upper (last_name)
INTO upper_first_and_last
FROM employees
WHERE employee_id = x;
do_nothing_comments (1, 2); -- here we are calling the procedure
RETURN upper_first_and_last;
END;
/
Теперь давайте вызовем функцию.
DECLARE
X NUMBER;
v_Return VARCHAR2(200);
BEGIN
X := 101;
v_Return := UPPER_NAME(
X => X
);
:v_Return := v_Return;
END;
/
Я собираюсь сделать это в SQL Developer, используя функцию Execute с открытой функцией:
Я получаю ответ обратно ... это просто на 5 секунд дольше, чем нужно.