PL / SQL编程:使用块标签来区分变量

时间:2013-03-21 09:41:25

标签: oracle plsql plsqldeveloper

我已经编写了下面的代码行,并从PL / SQL Developer Tool执行相同的代码。

我还在Oracle 11g数据库中创建了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;

但是在执行第一个声明语句时,它会抛出错误,如下所示

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的新手,目前正在自学。

2 个答案:

答案 0 :(得分:1)

这是PL / SQL Developer词法分析器或解析器的错误。您可以通过将整个块放在另一个begin ... end;内来解决它。

SQL窗口同时适用于SQL和PL / SQL,但这两种语句类型具有不同的语法。编辑器窗口不需要完整的解析器。但它必须足够了解一个陈述,以便知道一个陈述何时结束而另一个陈述何时开始。有许多方法可以启动SQL语句以及启动PL / SQL块的几种方法。代码可能使用这样的分类算法:&#34;如果它以beginend的PL / SQL开头,那么它就是SQL&#34;。程序员可能忘记了PL / SQL可以以标签开头。由于解析器认为它是一个SQL语句,因此它会在第一个分号处停止。

您可以在错误中看到并突出显示它根据第一个分号分割语句:

enter image description here

Frank Schmitt的想法很好,通常可以解决这些问题。但在这种情况下,命令窗口和突出显示整个表达式都不能解决问题。

唯一的解决方法似乎是添加一个额外的beginend块,如下所示:

--Add extra begin/end to work around PL/SQL Developer parser bug.
begin
    <<main>>
    declare
        v_test number := 1;
    begin
        main.v_test := 1;
    end;
end;
/

答案 1 :(得分:0)

您的代码很好,所以我猜这是客户端问题。

PL / SQL Developer有不同类型的窗口 - 对于这种查询,你应该使用“命令窗口”(实际上是一个SQL / Plus提示符)。

如果运行整个脚本不起作用,请尝试单独运行每个语句(在“SQL窗口”中,您可以选择代码块并仅运行选择)。