мы можем вызвать процедуру внутри функции в PL / SQL? - PullRequest
1 голос
/ 15 марта 2012

мы можем вызвать функцию внутри процедуры, но можно ли вызвать процедуру внутри функции? Я пытался, но я не могу вызвать процедуру внутри функции. не могли бы вы сказать мне, почему мы не можем вызвать процедуру внутри функции?

Ответы [ 5 ]

9 голосов
/ 15 марта 2012

"Я пытался, но не могу вызвать процедуру внутри функции."

Как вы пробовали?Что ты пробовал?Каким образом вы потерпели неудачу?

Поскольку разрешено вызывать процедуры внутри функции.Так что, если это не работает для вас, то причина в вашем коде.Мы не можем диагностировать это, если вы не предоставите намного больше информации, чем у вас есть в настоящее время.

Две наиболее вероятные причины:

  1. В вашем коде есть синтаксическая ошибкачто препятствует его компиляции, или какая-либо другая ошибка, которая мешает исключению времени выполнения.

  2. Функция может находиться в области действия процедуры, но не наоборот.

  3. Ваша процедура делает что-то, что недопустимо, когда мы вызываем функцию в запросе (например, выдаем DML), а вы вызываете вашу функцию в операторе SELECT.

4 голосов
/ 15 марта 2012

Я собираюсь предположить, что у вас есть функция, объявленная первой, с последующей процедурой, похожей на:

DECLARE
  FUNCTION my_func RETURN NUMBER IS
  BEGIN
    RETURN 2;
  END my_func;

  PROCEDURE my_proc IS
  BEGIN
    DBMS_OUTPUT.PUT_LINE(my_func + 1);
  END my_proc;

BEGIN  -- main
  my_proc;
END;    -- main

Как показано выше, с функцией, объявленной первой, вы можете вызватьфункция из процедуры.Однако, если вы попробуете что-то вроде следующего (функция, объявленная перед процедурой, и функция, вызывающая процедуру):

DECLARE
  FUNCTION my_func RETURN NUMBER IS
  BEGIN
    my_proc;
    RETURN 2;
  END my_func;

  PROCEDURE my_proc IS
  BEGIN
    DBMS_OUTPUT.PUT_LINE('22');
  END my_proc;

BEGIN  -- main
  DBMS_OUTPUT.PUT_LINE(my_func);
END;    -- main

, компиляция не удастся, потому что my_func не может «увидеть» my_proc.Чтобы это работало, вам нужно добавить в «прототип» объявление my_proc:

DECLARE
  PROCEDURE my_proc;

  FUNCTION my_func RETURN NUMBER IS
  BEGIN
    my_proc;
    RETURN 2;
  END my_func;

  PROCEDURE my_proc IS
  BEGIN
    DBMS_OUTPUT.PUT_LINE('22');
  END my_proc;

BEGIN  -- main
  DBMS_OUTPUT.PUT_LINE(my_func);
END;    -- main

Делитесь и наслаждайтесь.

1 голос
/ 15 марта 2012

Я предполагаю, что вы используете call proc или exec proc.Ниже приведен пример вызова процедуры.

CREATE OR REPLACE function f() return number as
BEGIN
  your_proc;
  another_proc_with_param(2, 'John');
  return 0;
EXCEPTION when others then return -1;
END f;

Однако, если ваша функция (или процедуры, вызываемые вашей функцией) выполняет DML, ваша функция не может использоваться в операторах sql. (Может использоватьсятолько в блоках PLSQL).

0 голосов
/ 06 февраля 2017

-------------------------- Процедура внутри функции ------------------ -----------

create or replace function f_2  return date as

begin

declare

today_date date;

x number; 

------- объявление процедуры -----------------

procedure pro_3(d_date out date )

is

begin

d_date:=sysdate;

end pro_3;

BEGIN 

--------- процедура называется --------------------

pro_3(today_date);

for x in 1..7 LOOP 

IF TO_CHAR(today_date,'FMDAY')='SUNDAY' THEN 

GOTO label_name; 

END IF; 

today_date:=today_date+1; 

END LOOP; 

<<label_name>> 

DBMS_OUTPUT.PUT_LINE(TO_CHAR(today_date,'DAY')||today_date);

end;

DBMS_OUTPUT.PUT_LINE('today is  ' ||TO_CHAR(sysdate,'DAY'));

return sysdate;

end;

---------------------------------- исполнение ------------ ---------------------

exec dbms_output.put_line(f_2);
0 голосов
/ 21 ноября 2016
create or replace function test_fun(id in number) return number 
as 
val number;
begin 
get_data(id,val);
return val;
end;

create or replace procedure get_data(a in number ,b out number)
as
id number; 
begin
b:=a*a;
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...