PL/SQL 函数错误
Posted
技术标签:
【中文标题】PL/SQL 函数错误【英文标题】:PL/SQL Function Error 【发布时间】:2011-06-18 13:19:28 【问题描述】:我在这个函数上有一个错误。 我不知道为什么它不起作用。
你能帮帮我吗?
CREATE OR REPLACE FUNCTION EMPNAM(empno in number)
RETURN VARCHAR2 IS
DECLARE nam VARCHAR2(40);
BEGIN
SELECT BEZEICHNUNG
INTO nam
FROM PROJ_PROJEKT
WHERE PROJEKTID = empno;
RETURN nam;
END EMPNAM;
这是错误信息:
ERROR: Error at line 7:
PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following:
( begin case declare end exception exit for goto if loop mod
null pragma raise return select update while with
continue close current delete fetch lock
insert open rollback savepoint set sql execute commit forall
merge pipe purge
5. select BEZEICHNUNG into nam from PROJ_PROJEKT where PROJEKTID=empno;
6. return nam;
7. END EMPNAM;
【问题讨论】:
顺便说一句,最好先写nam PROJ_PROJEKT.BEZEICHNUNG%type;
然后写nam varchar2(40);
- 这样,当有人进入名称较长的项目时(可能在更改表中的列长度之后),您的函数不会中断)
您可以将变量命名为 lastname 而不是 nam,如果在 SQL 语句中使用它时,您使用函数名称命名它:例如。 "选择姓氏到 emp_lastnam.lastnam ..."
【参考方案1】:
我认为你不需要DECLARE
关键字。 syntax 是:
create or replace function foo
return return-type
is
(vars)
begin
(code)
end foo;
【讨论】:
其实IS|AS
也用在过程中。但是,在匿名块中,您可以使用DECLARE
。 :)
过程中不需要声明选项。你可以使用它,你不必。匿名块在声明变量时需要它们。【参考方案2】:
你需要去掉DECLARE
关键字
例如:
CREATE OR REPLACE FUNCTION patient_func
RETURN VARCHAR2
IS
patient_name VARCHAR(20);
BEGIN
SELECT first_name
INTO patient_name
FROM patient_tbl
WHERE patientID = 123;
RETURN patient_name;
END patient_func;
【讨论】:
【参考方案3】:不得在您的代码中使用声明和
SELECT BEZEICHNUNG
INTO nam
FROM PROJ_PROJEKT
WHERE PROJEKTID = empno;
在上面的语句中,什么是“BEZEICHNUNG”...如果它是一个名字,它不能直接移动到 nam 列名可以移动到标识符中...上面的代码必须如下所示
select lastname into nam
from proj_projekt
where projektid=empno;
这里的“lastname”是移动到标识符“name”中的列名
【讨论】:
以上是关于PL/SQL 函数错误的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的 PL/SQL 触发器会引发“错误(2,2):PL/SQL:语句被忽略”和“错误(2,5):PLS-00204:函数或伪列'EXISTS'”错误?