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

Sql PLS-00103:遇到符号“;“文件结束”;当预期以下情况之一时:;,sql,oracle,plsql,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 e

我正在运行以下脚本-

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

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

在PL/SQL中,不能只选择一些数据。结果会怎样

你的选择是:

  • 删除
    BEGIN
    END
    ,然后运行SELECT with SQL*plus或其他一些可以运行SQL语句并在某处显示结果的工具

  • 使用
    SELECT department\u name INTO dep\u name
    将结果放入PL/SQL变量(仅当您的选择返回一行时有效)

  • 使用
    SELECT department\u name BULK COLLECT INTO dep\u name\u table
    将结果放入PL/SQL表(适用于多行)


或者,您可以描述您试图实现的目标以及希望在什么环境下运行SQL或PL/SQL代码。

PLS-00103
始终表示编译器已抛出,因为我们出现了语法错误。如果消息文本说:
你犯了语法错误,请检查你的代码,那就太好了,可惜它没有

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


Oracle的文档是全面的、在线的。您可以找到关于将SQL查询集成到PL/SQL的部分。我劝你读一读,以防你提出下一个问题。因为一旦你修复了简单的语法bloomer,你会碰到太多的行(假设你有多个部门)。

为了避免太多行的问题,你可以使用一个光标,类似这样的东西(我没有测试过,但大致上是这样)


这将把它在表中找到的第一个值放入v_部门。使用ORDERBY子句确保返回的行是所需的行,假设可能有两个不同的值 但Oracle Sql Developer中有一个有趣的bug,它可能会模拟这个问题

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 with with with with with
这个答案在2020年仍然适用。编译器会呕吐并抛出这个,但希望包括一行/位置来帮助调试。
exec dbowner.sp1 ( p1, p2, p3); -- notes about the fields
exec dbowner.sp1 ( p1, p2, p3); 
-- notes about the fields