将过程参数与游标值进行比较

Posted

技术标签:

【中文标题】将过程参数与游标值进行比较【英文标题】:Comparing procedure parameter with cursor values 【发布时间】:2013-06-26 11:28:54 【问题描述】:

我正在写下面的代码。将过程 IN 参数与光标值进行比较。

create or replace procedure  dashboard_addtion(customer_name IN varchar2)
IS
num number:=0;
CURSOR cname_cur 
    IS Select customername from customer_master;
cname varchar2(300);
begin
    for cname in cname_cur loop
        if upper(cname.customername)!=upper(customer_name) then
            num:=num+1;
        end if;
    end loop;
    if num != 0 then 
        insert into customer_master select max(customerid) + 1, customer_name
        from customer_master;
    end if;
end;

一直在执行 INSERT 语句。

【问题讨论】:

标题似乎与问题无关,但我不完全确定问题是什么。您正在遍历所有现有记录并计算与您的参数不匹配的记录;如果 any 不匹配,那么您将插入一条新记录。您是否真的仅在不存在与参数匹配的记录时才尝试插入新记录?你不需要一个光标。 @AlexPoole:是的,Alex 我正在尝试插入新记录,只有当它已经不存在时。 @AlexPoole:是的,我知道不使用光标是可能的。但我只是想清楚地了解光标的工作原理,请建议 TY :) 其中有很多变量名称混淆,过程名称拼写错误——所有这些都会让你和同事在真实的开发环境中发疯。将您的 PL/SQL 变量命名为与它们等效的数据库列相同,并在 SQL 语句中使用它们时使用 PL/SQL 块名称命名它们(例如,“customer_master.customer_name = dashboard_addition.customer_name”)。 【参考方案1】:

在您明确想要试验游标的基础上...您似乎有 num 增量的逻辑并向后检查:

for cname in cname_cur loop
  if upper(cname.customername) = upper(customer_name) then
    num := num+1;
  end if;
end loop;
if num = 0 then 
  insert into customer_master
  select max(customerid)+1,customer_name from customer_master;
end if;

这将计算 do 与您的参数匹配的游标记录,并且仅在找到 none 时才进行插入。

使用boolean 标志可能更清楚:

... is
  found boolean := false;
  cursor cname_cur is select custname from customer_master;
begin
  for cname in cname_cur loop
    if upper(cname.customername) = upper(customer_name) then
      found := true;
    end if;
  end loop;
  if not found then
    insert into customer_master
    select max(customerid)+1,customer_name from customer_master;
  end if;
end;

另请注意,您不需要显式声明cname;它被重新声明为for ... in ... loop 语法的一部分。

【讨论】:

谢谢,我可能需要您的更多帮助才能熟悉 PL/SQL :)

以上是关于将过程参数与游标值进行比较的主要内容,如果未能解决你的问题,请参考以下文章

WebGL-四

求oracle高手,存储过程中取游标值时,出现数据类型不一致问题,急急

如何在过程中的表中插入游标值

bitcoin PoW原理及区块创建过程

如何从存储过程中获取mysql游标值

c#中两种不同的存储过程调用与比较