0

我有 pl/sql 匿名块,如下所示

declare
  v_count pls_integer := 0;
begin
  select count(1) from product_component_version
    into v_count
   where product like '%Enterprise%';
  if v_count = 0 then
    raise program_error;
  end if;
exception
  when program_error then
    raise_application_error (-20001, 'This is valid for Oracle Enterprise Edition         only!');
end;

当我尝试执行上述操作时,出现以下错误

ORA-06550: line 5, column 5:
PL/SQL: ORA-00933: SQL command not properly ended

这只不过是“进入 v_count”声明。

根据我的理解,语法是错误的,当我像下面那样更改该语句时,它工作正常。

select count(1) into v_count
  from product_component_version
 where product like '%Enterprise%';

我在“Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit”中对此进行了测试。

但是原始脚本在我们所有旧版本的产品中都可用。我想知道旧版 oracle 支持原始脚本中的语法吗?或者你能告诉我任何可以回答我困惑的信息吗?

谢谢,维杰

4

3 回答 3

3

使用测试块:

declare
    x dual.dummy%type;
begin
    select dummy from dual into x;
end;
/

在 Oracle 9iR2(Solaris 上的 9.2.0.8)、10gR2(Solaris 上的 10.2.0.5)和 11gR2(Linux 上的 11.2.0.3)中,我得到完全相同的错误:

    select dummy from dual into x;
                           *
ERROR at line 4:
ORA-06550: line 4, column 28:
PL/SQL: ORA-00933: SQL command not properly ended
ORA-06550: line 4, column 5:
PL/SQL: SQL Statement ignored

尽管我没有 8i 或更早的数据库可供测试,但我不相信它曾经像您那样得到支持。

您说“原始脚本在我们所有旧版本的产品中都可用”,但它实际上是否曾经运行过,如果是这样,您能否确定它没有引发错误的确切版本?

于 2013-02-06T14:43:15.407 回答
2

至少不是从 8i 开始: http ://www.oracle.com/pls/tahiti/tahiti.tabbed?section=49135

于 2013-02-06T14:34:15.940 回答
0

即使我不喜欢从双重选择虚拟到x;

试试这个:

declare
  v_count pls_integer := 0;
begin
  select count(1) into v_count from product_component_version

   where product like '%Enterprise%';
  if v_count = 0 then
    raise program_error;
  end if;
exception
  when program_error then
    raise_application_error (-20001, 'This is valid for Oracle Enterprise Edition         only!');
end;
于 2013-02-06T14:46:40.997 回答