Процедура в качестве аргумента в PL / SQL - PullRequest
0 голосов
/ 18 июня 2019

Я хочу выполнить процедуру, которая принимает другую процедуру в качестве аргумента, который имеет некоторые другие аргументы или параметры.Например,

ProcA(Proc_B(Name Varchar2, ID Varchar2))

Возможно ли это?Если да, пожалуйста, предложите мне возможное решение.

1 Ответ

2 голосов
/ 18 июня 2019

Это невозможно.

Процедура напрямую не возвращает значение. Это отличается от функции, которая возвращает значение.

Чтобы вы могли сделать:

ProcedureA( FunctionB( name, id ) )

(Примечание. Это не передача функции в качестве аргумента, а передача результата функции в качестве аргумента.)

Как это:

DECLARE
  FUNCTION FunctionB(
    name   IN  VARCHAR2,
    id     IN  NUMBER
  ) RETURN VARCHAR2
  IS
  BEGIN
    RETURN name || id;
  END;

  PROCEDURE ProcedureA(
    value IN VARCHAR2
  )
  IS
  BEGIN
    DBMS_OUTPUT.PUT_LINE( value );
  END;
BEGIN
  ProcedureA(
    FunctionB(
      name   => 'A',
      id     => 1
    )
  );
END;
/

Альтернативой может быть использование выходного параметра из ProcedureA и промежуточной переменной:

DECLARE
  temp VARCHAR2(50);

  PROCEDURE ProcedureB(
    name   IN  VARCHAR2,
    id     IN  NUMBER,
    result OUT VARCHAR2
  )
  IS
  BEGIN
    result := name || id;
  END;

  PROCEDURE ProcedureA(
    value IN VARCHAR2
  )
  IS
  BEGIN
    DBMS_OUTPUT.PUT_LINE( value );
  END;
BEGIN
  ProcedureB(
    name   => :name,
    id     => :id,
    result => temp
  );
  ProcedureA( temp );
END;
/

Но вы не можете вложить одну процедуру в вызов, вызывающий другую.

...