PL/SQL 编程:使用块标签来区分变量
Posted
技术标签:
【中文标题】PL/SQL 编程:使用块标签来区分变量【英文标题】:PL/SQL Programming: Using block labels to differentiate variables 【发布时间】:2013-03-21 09:41:24 【问题描述】:我已经编写了下面的代码行,并从 PL/SQL Developer Tool 执行它。
我还在我的 Oracle 11g 数据库中创建了 HR 模式。
代码
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 的新手,目前正在自学。
【问题讨论】:
你试过去掉标签并运行它吗? 【参考方案1】:这是 PL/SQL Developer 词法分析器或解析器的错误。您可以通过将整个块包含在另一个 begin ... end;
中来解决它。
SQL 窗口适用于 SQL 和 PL/SQL,但是这两种语句类型有不同的语法。编辑器窗口不需要完整的解析器。但它必须对一个语句有足够的了解,才能知道一个语句何时结束,另一个语句何时开始。启动 SQL 语句的方法有很多,而启动 PL/SQL 块的方法很少。该代码可能使用了这样的分类算法:“如果它以begin
或end
开头,则为PL/SQL,否则为SQL”。程序员可能忘记了 PL/SQL 可以以标签开头。由于解析器认为这是一条 SQL 语句,因此它在第一个分号处停止。
您可以在错误和下面的突出显示中看到它正在根据第一个分号拆分语句:
Frank Schmitt 的想法很好,通常可以解决这类问题。但在这种情况下,无论是命令行窗口还是突出显示整个表达式都无法解决问题。
唯一的解决方法似乎是像这样添加一个额外的 begin
和 end
块:
--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;
/
【讨论】:
【参考方案2】:您的代码很好,所以我猜这是客户端问题。
PL/SQL Developer 有不同类型的窗口 - 对于这种查询,您应该使用“命令窗口”(本质上是一个 SQL/Plus 提示符)。
如果运行整个脚本不起作用,请尝试单独运行每个语句(在“SQL 窗口”中,您可以选择一个代码块并只运行所选内容)。
【讨论】:
以上是关于PL/SQL 编程:使用块标签来区分变量的主要内容,如果未能解决你的问题,请参考以下文章
在使用 Entity Framework 数据库优先在表上插入行之前,如何从 PL/SQL 执行触发器?
如何在选择语句的“NOT IN”子句中使用逗号分隔的字符串列表作为 pl/sql 存储的函数参数
Windows 64位 安装Oracle instantclient 官方绿色版和PL/SQL Developer 总结