低于 11g 的 Oracle 版本中的 Oracle "into" 子句

Posted

技术标签:

【中文标题】低于 11g 的 Oracle 版本中的 Oracle "into" 子句【英文标题】:Oracle "into" clause in Oracle version below 11g 【发布时间】:2013-02-06 14:31:50 【问题描述】:

我有 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

这不过是“into 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 支持原始脚本中的语法吗? 或者你能告诉我任何可以回答我困惑的信息吗?

谢谢, 维杰

【问题讨论】:

我认为第一种语法曾经不受支持。 “脚本可用”?它没有存储在数据库中,所以我假设这个非工作代码位于某个文件中(并且从未使用过)。你怎么知道这段代码正在被使用(不管是什么版本)? 【参考方案1】:

带有测试块:

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 或更早版本的数据库可供测试,但我认为它从未像您那样得到支持。

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

【讨论】:

与原问题无关,为什么不使用%ROWTYPEselect *?打字速度更快 @Plouf - 没有特别的原因;避免避免select * 的习惯,以及 OP 选择单个值而不是一行;它对效果没有影响。考虑保存 6 次按键(如果您将 shift-8 算作一次将 * 算作一次)是否符合过早优化的条件? *8-) 可能是。 :-) 但我宁愿把它当作一种习惯。并且在引用时经常忘记的过早+1 @Plouf 输入速度更快但不完整当where 子句找不到匹配项时,您的版本将抛出ORA-01403, no data found。所以你需要添加一个exception when no_data_found then raise_application_error...。或者添加一条评论,让使用此脚本的人知道“未找到数据”的真正含义。 @AlexPoole,我弄错了您和 Plouf 在谈论更改的问题。现在我觉得很傻。【参考方案2】:

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

【讨论】:

【参考方案3】:

即使我也不喜欢 select dummy from dual into 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;

【讨论】:

问题也显示了有效的语法,所以这不是问题;这是无效语法是否(以及如何)起作用。

以上是关于低于 11g 的 Oracle 版本中的 Oracle "into" 子句的主要内容,如果未能解决你的问题,请参考以下文章

SUSE11 Oracle 11g RAC双机集群环境部署

webService 无法连接连接oracle 11g

Oracle 9i和Oracle 11g中的 i 和 g 分别是啥意思?

11G新特性 -- ASM的兼容性

Oracle安装(11g)静默安装

求oracle 11G 11.2.0.4.0版本的补丁包,或是oracle的官网的服务号