低于 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 或更早版本的数据库可供测试,但我认为它从未像您那样得到支持。
您说“原始脚本在我们所有旧版本的产品中都可用”,但它是否真的曾经运行过,如果是这样,您能否确定它没有引发错误的确切版本?
【讨论】:
与原问题无关,为什么不使用%ROWTYPE
和select *
?打字速度更快
@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" 子句的主要内容,如果未能解决你的问题,请参考以下文章