【问题标题】:PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following: ;PLS-00103:在预期以下情况之一时遇到符号“文件结尾”:;
【发布时间】:2011-10-21 12:07:57
【问题描述】:

我正在运行以下脚本 -

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: 
;

【问题讨论】:

    标签: sql oracle plsql


    【解决方案1】:

    在 PL/SQL 块选择语句中应该有一个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; 
    

    【讨论】:

      【解决方案2】:

      PLS-00103 总是意味着编译器已经抛出,因为我们犯了语法错误。如果消息文本说:You have made a syntax error, please check your code,那就太好了,可惜不是。

      无论如何,在这种情况下,错误是在 PL/SQL 中选择语句必须填充一个变量。这与说 T-SQL 的行为不同。因此,您需要定义一个与查询的投影相匹配的变量并选择 INTO 该变量。

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

      【讨论】:

      • 这个答案在 2020 年仍然适用。编译器会吐槽并抛出这个,但希望包含一个行/位置来帮助调试。
      【解决方案3】:

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

      您的选择是:

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

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

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

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

      【讨论】:

        【解决方案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 个不同的值。

        【讨论】:

          【解决方案5】:

          大多数人不会认为电话是问题,

          但在 Oracle Sql Developer 中有一个有趣的错误,它可能会模拟这个问题..

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

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

          begin case 为 goto if loop mod 声明结束异常退出 null pragma raise return select update while with

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

          PL/SQL 过程成功完成。

          【讨论】:

            猜你喜欢
            • 2015-07-07
            • 1970-01-01
            • 2015-02-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-09-19
            • 2014-09-18
            • 2012-10-26
            相关资源
            最近更新 更多