我已经写了下面的代码行,并执行它从PL/SQL开发工具相同。
我还在Oracle 11 g数据库中创建了HR Schema。
代码
CREATE TABLE employees2 AS SELECT last_name FROM employees;
<<MAIN>>
DECLARE
last_name VARCHAR2(10) := 'King';
my_last_name VARCHAR2(10) := 'King';
BEGIN
-- Deletes everyone, because both LAST_NAMEs refer to the column
DELETE FROM employees2 WHERE last_name = last_name;
dbms_output.put_line('Deleted ' || SQL%ROWCOUNT || ' rows.');
ROLLBACK;
-- OK, column and variable have different names
DELETE FROM employees2 WHERE last_name = my_last_name;
dbms_output.put_line('Deleted ' || SQL%ROWCOUNT || ' rows.');
ROLLBACK;
-- OK, block name specifies that 2nd LAST_NAME is a variable
DELETE FROM employees2 WHERE last_name = main.last_name;
dbms_output.put_line('Deleted ' || SQL%ROWCOUNT || ' rows.');
ROLLBACK;
END;
/
DROP TABLE employees2;
但是在执行第一个declare语句时,它会抛出如下错误
ORA-06550: line 4, column 0:
PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following:
* & = - + ; < / > at in is mod remainder not rem
<an exponent (**)> <> or != or ~= >= <= <> and or like like2
like4 likec between || multiset member submultiset
请指导我,因为我是PL/SQL的新手,目前正在自学。
3条答案
按热度按时间lhcgjxsq1#
这是PL/SQL Developer词法分析器或解析器的一个bug。您可以通过将整个块包含在另一个
begin ... end;
中来解决它。SQL窗口可以同时使用SQL和PL/SQL,但是这两种语句类型有不同的语法。编辑器窗口不需要完整的解析器。但是它必须对语句有足够的了解,以便知道一个语句何时结束,另一个语句何时开始。有很多方法可以启动SQL语句,而很少有方法可以启动PL/SQL块。代码可能使用如下的分类算法:“如果它以
begin
或end
开头,则是PL/SQL,否则是SQL”。程序员可能忘记了PL/SQL可以以标签开始。由于解析器认为它是SQL语句,因此它在第一个分号处停止。您可以在下面的错误和突出显示中看到,它基于第一个分号分割语句:
Frank施密特的想法很好,通常可以解决这类问题,但在这种情况下,命令窗口和高亮显示整个表达式都不能解决问题。
唯一的解决办法似乎是添加一个额外的
begin
和end
块,如下所示:xtupzzrd2#
你的代码很好,所以我猜这是客户端的问题。
PL/SQL Developer有不同类型的窗口-对于这种查询,您应该使用“命令窗口”(本质上是SQL/Plus提示符)。
如果运行整个脚本不起作用,请尝试单独运行每个语句(在“SQL窗口”中,您可以选择一个代码块并仅运行所选内容)。
prdp8dxp3#
这条评论是正确的。使用命令窗口,而不是SQL窗口。如果你去掉SQL*PLUS的东西,比如SET SERVEROUTPUT...等,你也可以使用测试窗口来练习脚本。这允许一种调试,尽管我不太清楚如何在主脚本本身中放置断点-只称为对象。
因此,对于一个获取模式中所有物化视图并重新编译无效视图的大型示例,刷新它们并安排它们进行夜间刷新。
请注意,SQL PLUS命令行工具在此处针对测试窗口关闭,但不需要针对PL/SQL开发人员命令窗口禁用...: