【发布时间】:2013-05-06 11:50:45
【问题描述】:
我必须编写一个 pl/sql 代码(实际上是一个函数),它在将郊区作为参数时返回一个邮政编码 代码是这样的:
create or replace
FUNCTION get_postCode(p_suburb IN varchar2)
RETURN varchar2
IS
--
v_postcode varchar2;
--
CURSOR c1 IS
SELECT locality, postcode FROM table_postcode;
--
BEGIN
--
FOR r1 IN c1
loop
IF upper(r1.locality) = upper(p_suburb)
THEN
v_postcode := r1.postcode;
return v_postcode;
END IF;
exit WHEN c1%notfound;
END loop;
-- return v_postcode;
--
exception WHEN others then
v_postcode := null;
END;
table_postcode 是从 Post Office 获得的,它包含郊区(作为表格中的列)和邮政编码以及与此案例无关的其他字段。
当我使用该函数时,它返回正确的值,当我将这个函数用作 SELECT 子句的列时,它仅在我不在 FROM 子句之后添加任何其他子句时才返回。这对我来说很奇怪。
情况是:
select street, suburb, get_postcode(suburb) from my_table;
上面的行给了我结果,但是
select street, subur, get_postcode(suburb) from my_table order by suburb;
失败并给我以下错误消息:
ORA-06503: PL/SQL: Function returned without value
ORA-06512: at "U11254683.GET_POSTCODE", line 25
06503. 00000 - "PL/SQL: Function returned without value"
*Cause: A call to PL/SQL function completed, but no RETURN statement was
executed.
*Action: Rewrite PL/SQL function, making sure that it always returns
a value of a proper type.
如果我在这样的块中调用函数:
Declare
v_post varchar2(10);
Begin
v_post := get_postcode('Sydney');
DBMS_OUTPUT.PUT_LINE('The post code is '||v_post);
End;
结果是正确的,给了我 2000。
【问题讨论】:
-
你为什么要使用光标?
-
遍历表格并检查郊区匹配并获取邮政编码,我做错了吗?或者...
-
简短回答:是的 - SQL 是一种基于集合的语言,最适合用于基于集合的操作。有关使用函数的更好方法,请参阅 hol 的答案。
-
谢谢,给初学者的好课
标签: sql database oracle select plsql