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 函数在执行时抛出进程内存错误

PL/SQL 函数返回错误结果

为啥我的 PL/SQL 触发器会引发“错误(2,2):PL/SQL:语句被忽略”和“错误(2,5):PLS-00204:函数或伪列'EXISTS'”错误?

PL/sql 函数返回多行错误

PL/SQL:使用编译错误创建的函数 [关闭]

PL/SQL 函数错误 - PLS-00103:遇到符号“IS”