【问题标题】:can cursors be passed with parameters at execution time游标可以在执行时带参数传递吗
【发布时间】:2018-11-03 17:32:16
【问题描述】:

游标可以动态传递参数吗?

例如:

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('record not found') 也不会执行。任何人都可以纠正代码吗?

【问题讨论】:

  • 我对PLSQL有点生疏,但我认为获取下一条记录的命令是FETCH,而不是GET。至于传递 VALUE,您的问题表明您想要完全按照您展示的方式进行操作。试着改写一下,这样更清楚。
  • @FDavidov 'get' 这里是光标的名称。 Fetch 是一个关键字,用于从游标中获取值到声明的变量中。
  • 嗯,这超出了我的记忆。如前所述,我生锈了。抱歉,我不能提供更多帮助。
  • 没问题...plsql很简单,但问题是当我们失去联系时,它真的很难回忆...

标签: sql plsql oracle11g plsqldeveloper


【解决方案1】:

如果需要,您可以将过程参数传递给光标:

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 变量定义,因为它从未使用过; for rec in ... 中的 rec 是一个完全不相关的变量。

您的所有dbms_output 逻辑都在光标 for 循环内,因此只会在循环内进行评估 - 即当有数据时。如果你想使用这个循环结构,你可以使用一个标志来记录你是否已经进入循环,比如:

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;

【讨论】:

    猜你喜欢
    • 2023-01-10
    • 1970-01-01
    • 1970-01-01
    • 2011-01-06
    • 1970-01-01
    • 2016-01-28
    • 2020-07-12
    • 1970-01-01
    • 2011-08-16
    相关资源
    最近更新 更多