PLS-00103:当遇到以下情况之一时遇到符号“文件结束”:

时间:2011-08-06 14:41:43

标签: sql oracle plsql

我正在运行以下脚本 -

BEGIN
    select department_name 
    from egpl_department 
    where department_id in (select department_id 
                            from egpl_casemgmt_activity);
END ;

得到错误 -

PLS-00103: Encountered the symbol "end-of-file" when 
expecting one of the following: 
;

5 个答案:

答案 0 :(得分:15)

在PL / SQL块中,select语句应该有一个into子句:

DECLARE
 v_department egpl_department.department_name%type;
BEGIN 
  select department_name 
  into   v_department
  from   egpl_department 
  where  department_id in (select department_id from egpl_casemgmt_activity); 

  -- Do something useful with v_department
END; 

答案 1 :(得分:8)

在PL / SQL中,您不能只选择一些数据。应该在哪里结果?

您的选择是:

  • 删除BEGINEND并运行带有SQL * plus的SELECT或其他可以运行SQL语句并在某处显示结果的工具。

  • 使用SELECT department_name INTO dep_name将结果放入PL / SQL变量(仅当SELECT返回单行时才有效)

  • 使用SELECT department_name BULK COLLECT INTO dep_name_table将结果放入PL / SQL表(适用于多行)

或许您可以描述您想要实现的目标以及您希望在什么环境中运行SQL或PL / SQL代码。

答案 2 :(得分:7)

PLS-00103总是意味着编译器已经抛出,因为我们已经出现了语法错误。如果消息文本说:You have made a syntax error, please check your code但是它没有。{/ p>,那将是非常好的

Oracle的文档是全面的在线文档。您可以找到有关将SQL查询集成到PL / SQL here中的部分。我恳请你阅读它,以防止你的下一个问题。因为一旦你修复了简单的语法bloomer,你就会遇到TOO_MANY_ROWS(假设你有多个部门)。

答案 3 :(得分:4)

为了避免too_many_rows问题,你可以使用一个这样的游标(我没有测试过这个,但是沿着这些行)

DECLARE 

 v_department egpl_department.department_name%type;

 cursor c_dept IS
  select department_name 
  into   v_department
  from   egpl_department 
  where  department_id in (select department_id from egpl_casemgmt_activity)
  order by department_name; 

BEGIN 

  OPEN c_dept;
  FETCH c_dept INTO v_department;
  CLOSE c_dept;

  -- do something with v_department

END;

这会将它在表中找到的第一个值放入v_department。使用ORDER BY子句确保返回的行将是您需要的行,假设可能有2个不同的值。

答案 4 :(得分:1)

大多数人都不会将通话视为问题,

但是这是Oracle Sql Developer中的一个有趣的错误,可以模拟该问题。

exec dbowner.sp1 ( p1, p2, p3); -- notes about the fields

错误报告- ORA-06550:第1行,第362列: PLS-00103:预期以下情况之一时遇到符号“文件结束”:

开始情况为循环mod声明goto的结束异常退出 null pragma提高收益选择与 <<关闭当前删除获取锁插入 打开回滚保存点设置sql执行commit forall合并 管 06550。00000-“%s行,%s列:\ n%s” *原因:通常是PL / SQL编译错误。 *动作:

exec dbowner.sp1 ( p1, p2, p3); 
-- notes about the fields

PL / SQL过程成功完成。