Вызов процедуры в функции - PullRequest
0 голосов
/ 24 мая 2019

Можете ли вы вызвать процедуру PL / SQL изнутри функции?

Я не сталкивался с практическим примером. Так что, если кто-то сталкивался с этим, пожалуйста, поделитесь.

Ответы [ 2 ]

1 голос
/ 25 мая 2019

Да. Вы можете вызвать любую программу 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 с открытой функцией:

enter image description here

Я получаю ответ обратно ... это просто на 5 секунд дольше, чем нужно.

0 голосов
/ 26 мая 2019

Вот, пожалуйста:

create or replace function demo
    return varchar2
as
begin
    dbms_output.put_line('Hello');
    return 1;
end demo;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...