我正在运行以下脚本 -
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:
;
答案 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中,您不能只选择一些数据。应该在哪里结果?
您的选择是:
删除BEGIN
和END
并运行带有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过程成功完成。