можно ли передавать курсоры с параметрами во время выполнения - PullRequest
0 голосов
/ 24 мая 2018

могут ли курсоры передавать параметры динамически?

, например:

create or replace procedure getRec
as
cursor get(nameToGet varchar2) is select * from test where name = nameToGet;
rec test%rowtype;
begin
for rec in get('sam') loop
if get%notfound then
dbms_output.put_line('No record found');
else
dbms_output.put_line('Name : ' || ' ' || rec.name ||' ::: ' || 'Address : ' 
|| rec.address);
end if;
end loop;
end;

, но это жестко задано (значение nameToGet).Как я могу динамически передать значение курсору (если это возможно)?Конечно, мы можем сделать это, используя параметризованную процедуру, такую ​​как

create or replace procedure getRec(nameToGet IN varchar2)

, и курсор будет выглядеть как

cursor get is select * from test where name = nameToGet;

, но я хочу создать параметризованный курсор и динамически передать значение курсору.

С другой стороны, dbms_output ('запись не найдена') не выполняется, когда запись не найдена.Кто-нибудь может исправить код?

1 Ответ

0 голосов
/ 24 мая 2018

Вы можете просто передать аргумент процедуры в курсор, если хотите:

create or replace procedure getRec(nameToGet IN varchar2)
as
cursor get(nameToGet varchar2) is select * from test where name = nameToGet;
begin
for rec in get(nameToGet) loop
...

Может показаться, что это менее запутанно, если вы даете аргументам разные имена, например, имеете соглашение имен аргументов процедуры, начинающихся спрефикс 'p', аргументы курсора, начинающиеся с префикса 'c', или что-то еще.

И я убрал определение переменной rec, потому что оно никогда не используется;rec в for rec in ... - это совершенно не связанная переменная.

Вся ваша логика dbms_output находится внутри курсора для цикла, поэтому будет оцениваться только внутри цикла - т.е. при наличии данных.Если вы хотите использовать эту конструкцию цикла, вы можете использовать флаг, чтобы заметить, был ли вы вообще в цикле, что-то вроде:

create or replace procedure getRec(pNameToGet IN varchar2)
as
  cursor get(cNameToGet varchar2) is
  select * from test where name = cNameToGet;
  lDataSeen boolean := false;
begin
  for rec in get(pNameToGet) loop
    lDataSeen := true;
    dbms_output.put_line('Name : ' || ' ' || rec.name ||' ::: ' || 'Address : ' 
      || rec.address);
  end loop;

  if !lDataSeen then
    dbms_output.put_line('No record found');
  end if;
end;
...