将过程参数与游标值进行比较
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 :)以上是关于将过程参数与游标值进行比较的主要内容,如果未能解决你的问题,请参考以下文章