В процедуре Oracle, как определить локальную переменную и использовать ее после блока DECLARE? - PullRequest
0 голосов
/ 08 мая 2019

Я хочу создать сохраненный процесс, как показано ниже

create or replace PROCEDURE AAA
(
  cv_1 IN OUT SYS_REFCURSOR
)
as
BEGIN

  DECLARE ord_t VARCHAR2(20);
  begin
  SELECT order_type into ord_t from BT;
  dbms_output.Put_line(ord_t);
  end;

  if ord_t = 'xxx' THEN
      open cv_1 for
      select * from BA;
  else
      open cv_1 for
      select * from BB;
  END if;

END;

Но есть ошибка, говорящая, что ord_t должен быть объявлен. Как мне написать это правильно? Цель процедуры - возвращать результаты из BA или BB на основе значения ord_t.

1 Ответ

3 голосов
/ 08 мая 2019

Вам необходимо объявить переменную перед тегом BEGIN, в котором она должна использоваться

create or replace PROCEDURE AAA(cv_1 IN OUT SYS_REFCURSOR)
as
  ord_t VARCHAR2(20);
BEGIN
  SELECT order_type into ord_t from BT;
  dbms_output.Put_line(ord_t);

  if ord_t = 'xxx' THEN
      open cv_1 for
      select * from BA;
  else
      open cv_1 for
      select * from BB;
  END if;

END;

В процедурах CREATE OR REPLACE PROCEDURE name(params) AS заменяет DECLARE блока.Поэтому он вам здесь не нужен.

Определение блока:

DECLARE or CREATE FUNCTION/PROCEDURE
  (variables in block)
BEGIN
  (code using variables)
END

Примеры:

declare
  myvar number(1);
begin
  --begin scope of myvar--
  select 1 into myvar from dual;
  --end scope of myvar--
end;

create procedure myproc (var1 in number)
as
  myvarouter number(1);
begin
  --begin scope myvarouter--
  declare
    myvarinner number(1);
  begin
    --begin scope myvarinner--
    select 1 into myvarinner from dual;
    select 1 into myvarouter from dual;
    --end scope myvarinner--
  end;
  select 1 into myvarouter from dual;
  --end scope myvarouter--
end;

Другой вопрос с тем же содержанием может такжеможно найти здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...