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

これは、「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」でこれをテストしました。

ただし、元のスクリプトは、製品のすべての古いバージョンで利用できます。元のスクリプトの構文が古いバージョンのオラクルでサポートされていることを知りたいですか? または、私の混乱に答えることができるこれに関する情報を教えてください。

ありがとう、ビジェイ

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 に答える