预期以下情况之一时遇到符号“ INTO”

时间:2019-01-03 17:53:08

标签: plsql oracle12c

在定义函数时遇到以下错误。 “在预期以下情况之一时遇到符号“ INTO”:...” 我正在网站上尝试此示例。我还想了解这里使用的游标逻辑。

  
      
  1. 我们可以从定义部分获取值并关闭游标吗?
  2.   
  3. c1%notfound块并为p_cid分配高值9999的意义是什么?
  4.   
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  - 

2 个答案:

答案 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更改为表中的列名,我猜这只是idc_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