在定义函数时遇到以下错误。 “在预期以下情况之一时遇到符号“ INTO”:...” 我正在网站上尝试此示例。我还想了解这里使用的游标逻辑。
- 我们可以从定义部分获取值并关闭游标吗?
- c1%notfound块并为p_cid分配高值9999的意义是什么?
create or replace function get_cust_id(p_cname IN varchar2)
RETURN number
IS
p_cid number;
cursor c1 is
select p_cid from customers where c_name = p_cname;
BEGIN
OPEN c1;
FETCH c1 INTO into p_cid;
if c1%notfound
then
p_cid:=9999;
end if;
close c1;
RETURN p_cid;
EXCEPTION
WHEN OTHERS THEN
raise_application_error(-20001,'An error was encountered - '||SQLCODE||' -ERROR- '||SQLERRM);
END;
==========================================
上述“ INTO”问题已因打字错误而得到纠正。
我现在正在尝试调用该函数,但是输出不符合预期:
select c_name,get_cust_id(c_name) as cust_id
from customers
where city='London';
输出:
C_NAME CUST_ID
Alice -
Patrick -
答案 0 :(得分:0)
除了@Lukasz在评论中指出的双into
之外,您的游标查询还可以这样做:
select p_cid from customers where c_name = p_cname;
这里的p_cid
是您刚刚声明的数字,尚未分配值。因此,您实际上在做:
select null from customers where c_name = p_cname;
这就是为什么您的测试查询从函数调用中返回空值的原因。您需要在该查询中将p_cid
更改为表中的列名,我猜这只是id
或c_id
:
create or replace function get_cust_id(p_cname IN varchar2)
RETURN number
IS
p_cid number;
cursor c1 is
select c_id from customers where c_name = p_cname;
BEGIN
OPEN c1;
FETCH c1 INTO p_cid;
...
我们可以从定义部分获取值并关闭游标吗?
否。
c1%notfound块并为p_cid分配高值9999的意义是什么?
如果您传入的名称不存在(调用时不会发生这种情况,但是无论如何它都是非常人为设计的),那么游标查询将找不到该名称的数据。 fetch
不会引发错误,但实际上不会检索任何内容。 The %notfound` cursor attribute是正确的,因为未获取任何行。
在这种情况下,if c1%notfound
为真,因此执行p_cid:=9999;
语句,然后将该值返回给调用方。
有效地,它返回9999作为“魔术数字”,表明没有找到实际的ID。 (如果发生这种情况,返回null或引发异常可能更安全-魔术数字可能会在以后引起问题,例如-很明显-如果您还有ID 9999的真实客户...)
有一些更简单的方法可以实现此功能的作用,但是大概是它试图以人为的方式教给您特定的东西。
答案 1 :(得分:0)
当我更改以下行时,输出与预期的一样:
select c_id into p_cid from customers where c_name = p_cname;
输出:
C_NAME CUST_ID
Alice 3
Patrick 6