原因: COUNT以外のSQLグループ関数の引数リストで、アスタリスク(*)オプションが使用されました。たとえば、コードがSELECT SUM(*) INTO emp_count FROM emp;となっていた可能性があります。これはCOUNT(*)とする必要があります。表内の行数を戻すアスタリスク・オプションを使用できるのはCOUNTのみです。
原因: 一部の組込み関数は、引数のセパレータとして、(カンマ(,)のかわりに)キーワードを使用します。組込み関数の引数のセパレータはCHR、TRANSLATE USING CAST AS TRIM、TRAILING、LEADING、BOTH、FROMです。それ以外の組込み関数が、セパレータとして、キーワードを使用しています。
原因: 修飾名の接頭辞に、有効範囲外のサブプログラムまたはカーソルが指定されています。つまり、サブプログラム名またはカーソル名が、有効範囲外(そのサブプログラム内またはカーソル内)のエンティティを参照する有効範囲修飾子として使用されています。次に例を示します。declare x number; type t1 is record (a number); function f return t1 is a number; begin x := f.a; -- legal use of function "f" as a scope qualifier; -- resolves to local variable "a" in function "f". x := f().a; -- legal reference to component "a" of returned record end; begin x := f.a; -- illegal use of function "f" as a scope qualifier x := f().a; -- legal reference to component "a" of returned record end;
原因: サブプログラムの仮パラメータを宣言したときに、PROCEDURE my_proc (j NUMBER, k NUMBER := j) IS ...のように、1つのパラメータを使用して別のパラメータを初期化しようとしました。1番目のパラメータは実行時まで値を持たないため、他のパラメータの初期化には使用できません。
処置: 不正な仮パラメータ参照を削除してください。
PLS-00228: LONG型の変数は宣言できません。
原因: 識別子は、同じ仮パラメータ・リストに含まれる仮パラメータのデフォルト式の値のコンテキストで使用される仮パラメータです。次に例を示します。procedure p(j number, k number := j)
原因: 次のような型宣言-- REF以外の再帰的な型type t is record (a t);または-- REF以外の相互に依存する型type t1; type t2 is record (a t1); type t1 is record (a t2);などが実行されました。これらの例では、型はそれ自体および他の型とREF以外の相互再帰的な関係を持つため、無効です。
処置: 別の型を使用して、再帰を削除してください。
PLS-00319: INまたはNOT IN句の副問合せの列は1つである必要があります
原因: X IN (SELECT A,B ...)のような無効な式が使用されました。副問合せで[NOT]IN句を使用するときは、集合のメンバーであるかどうかは調べられません。[NOT]IN句内の式の数と副問合せのSELECTリスト内の式の数は一致する必要があります。したがって、前述の例では、副問合せで1つの列のみを指定する必要があります。
処置: 複数の列を選択しないように、副問合せを変更してください。
PLS-00320: この式の型の宣言が不完全か、または形式が誤っています。
原因: 宣言の中で、変数またはカーソルの名前の綴りに誤りがあるか、宣言が前方参照を行っています。PL/SQLでは前方参照ができません。変数またはカーソルは、他の文(他の宣言部も含む)で参照する前に宣言しておく必要があります。たとえば、dept_recの宣言であるDECLARE dept_rec dept_cur%ROWTYPE; CURSOR dept_cur IS SELECT ... ...は、未宣言のカーソルを参照しているために例外を呼び出します。...
原因: IN句の中の式の数が、対応する副問合せのSELECTリストの中の式の数と一致しません。たとえば、次の文はIN句に式が2つ含まれますが、副問合せのSELECTリストに含まれる式が1つのみであるため、不正な文になります。WHERE (ename, sal) IN (SELECT sal FROM emp);
処置: 各セットの式の数を確認し、数が一致するように式を修正してください。
PLS-00327: stringは、ここのSQL有効範囲にありません。
原因: SQL文で、有効範囲外のデータベース・オブジェクトに対して参照が行われました。参照されたオブジェクトの綴りに誤りがある、またはCURSOR c1 IS SELECT dept.dname FROM emp;のように参照が混在している可能性があります。
原因: 割当てターゲットの宣言で、代入された値を格納するために必要なコンポーネントが欠落しています。たとえば、列値の行をレコードではなく変数に代入すると、このエラーが発生します。次に例を示します。DECLARE dept_rec dept%ROWTYPE; my_deptno dept.deptno%TYPE; ... BEGIN SELECT deptno, dname, loc INTO my_deptno -- invalid FROM dept WHERE ...
原因: リテラル、定数、INパラメータ、ループ・カウンタまたはファンクション・コールが、誤って割当てターゲットとして使用されました。たとえば、次の文は、割当てターゲットの30が定数であるため不正な文です。SELECT deptno INTO 30 FROM dept WHERE ...-- illegal
処置: 正しい割当てターゲットを使用して、誤りのある文を修正してください。
PLS-00364: ループ索引変数stringの使用方法に誤りがあります。
原因: OUTパラメータの値を別のパラメータまたは変数に割り当てようとしました。
処置: OUTパラメータのかわりにIN OUTパラメータを使用してください。Inside a
PLS-00366: NOT NULLタイプのサブタイプは、同様にNOT NULLである必要があります
原因: サブタイプをNOT NULLとして定義した後、NULLとして定義されている別のサブタイプのベース型として使用しました。これは許可されていません。たとえば、コードが次のようになっていた可能性があります。DECLARE SUBTYPE Weekday IS INTEGER NOT NULL; SUBTYPE Weekend IS Weekday NULL; -- illegal 正しくは、次のとおりです。DECLARE SUBTYPE Weekday IS INTEGER NOT NULL; SUBTYPE Weekend IS Weekday;
原因: UNION式、INTERSECT式またはMINUS式の左右のSELECT句で選択されている列の数が違います。たとえば、次の文はSELECTリストの含む項目数が等しくないため不正です。CURSOR my_cur IS SELECT ename FROM emp INTERSECT SELECT ename, empno FROM emp;
原因: UNION式、INTERSECT式またはMINUS式の左右のSELECTリストで、データ型が一致しない列が1つ以上選択されています。たとえば、次の文は定数3のデータ型がNUMBERであるのに対し、SYSDATEのデータ型はDATEであるため不正です。CURSOR my_cur IS SELECT 3 FROM emp INTERSECT SELECT SYSDATE FROM emp;
原因: SELECT INTO文のINTO句が省略されました。たとえば、コードが次のようになっていた可能性があります。SELECT deptno, dname, loc FROM dept WHERE ... 正しくは、次のとおりです。SELECT deptno, dname, loc INTO dept_rec FROM dept WHERE ... PL/SQLでは副問合せのみがINTO句なしで書かれます。
原因: FORALL文のBULK In-BIND変数への参照が、その変数が許可されていないコンテキストで見つかりました。たとえば、このような変数は、動的SQL文のUSING句の式では許可されていません。forall j in 1..Users.Count() execute immediate ' insert into System_Users(Username) values :U' using Upper(Users(j));
処置: この場合は、次のようにしてUSING句の式をSQL文に移動します。forall j in 1..Users.Count() execute immediate ' insert into System_Users(Username) values Upper(:U)' using Users(j);
原因: SELECT文で、SELECTリストがSELECT (deptno, dname, loc) FROM dept INTO ...のようにカッコで囲まれています。これはSQLの構文規則に反しています。キーワードSELECTとFROMがSELECTリストの範囲を定めるため、カッコは必要ありません。
処置: SELECTリストを囲んでいるカッコを削除してください。
PLS-00487: 変数'string'への参照が無効です。
原因: 変数への参照がデータ型と矛盾しています。たとえば、次のようにスカラー変数を誤ってレコードとして参照した可能性があります。DECLARE CURSOR emp_cur IS SELECT empno, ename, sal FROM emp; emp_rec emp_cur%ROWTYPE; my_sal NUMBER(7,2); BEGIN ... total_sal := total_sal + my_sal.sal; -- invalid ...
原因: 次の例に示すように、ユーザー定義ファンクションのRETURN文で、式ではなくデータ型指定子が使用されました。RETURN文とRETURN句を混同しないでください。RETURN文は、結果値にファンクション識別子を設定し、RETURN句は結果値のデータ型を指定します。FUNCTION credit-rating (acct_no NUMBER) RETURN BOOLEAN IS BEGIN ... RETURN NUMBER; -- should be an expression END;
原因: MULTISETで戻されたコレクション内の列数がCAST型の列数と一致しません。次に例を示します。create type tab_obj as object (n number); create type tab1 as table of tab_obj; create table tab2 (col1 number, col2 number); select CAST(MULTISET(select col1, col2 from tab2) as tab1) from tab2;
原因: コンパイルされたライブラリ単位が、他のライブラリ単位と非REFの相互依存サイクルを形成しているため、コンパイルが異常終了しました。このエラーは、この型を伴うサイクルに加わる他の型の属性を持つ型とコンパイルしようとすると発生します。例: CREATE TYPE T1; CREATE TYPE T2 (A T1); CREATE TYPE T1 (A T2);
処置: 最初の理由でエラーが発生している場合は、参照されているオブジェクトの本体を作成してください。2番目の理由によってこのエラーが発生している場合は、順序をSQL文の中に移動してください。たとえば、i := seq.nextval;はselect seq.nextval into temp from dual; i := temp;に置き換えることができます。
原因: スキーマ・レベルのオブジェクト型か、またはこのような型を再帰的に使用する型がRPCで使用されましたが、これは許可されません。次に例を示します。create type foo as object (...) create package my_pack is type my_rec is record(v foo); -- on a remote server: x my_pack.my_rec@rpc; -- illegal attempt to use type my_rec
原因: メソッドのシグネチャの一部として定義されたクラス名が、EXTERNAL NAME句の型ヘッダーで定義されたクラス名と一致していません。次に例を示します。create type foo as object EXTERNAL NAME 'foo' LANGUAGE JAVA (... MEMBER FUNCTION my (number) return number EXTERNAL NAME 'bar.func(oracle.sql.NUMBER) return oracle.sql.NUMBER', .. );
原因: この<value expression>には標準化されていないデータ型が含まれています。X3H2の4.2項「Data types」では、「A nonnull value is either a character string or a number.」と示されています。STANDARDにある多くの組込み関数は、プラグマの方法によってこの警告とともにフラグ化されます。
原因: これらの<value expressions>のデータ型は、比較可能である必要があります。X3H2の4.2項「Data types」では、「A character string and a number are not comparable values.」と示されています。STANDARDにある多くの組込み関数は、プラグマの方法によってこの警告とともにフラグ化されます。この警告は、データ型の強制関数に対して発行されます。たとえば、非準拠のデータ型を組合せ可能にするためにOracle SQLに挿入されたTO_CHAR(<number>)などです。
原因: CHARデータ型の値を使用する演算子がありません。X3H2の5.9項「<value expression>」のsyntax rule 3では、「If the data type of a <primary> is character string, then the <value expression> shall not include any operators.」と示されています。この警告は、CHAR引数を取るSTDBASEにある多くの関数に対して発生します。
処置: 処置は必要ありません。
PLS-01455: IS NULLとIS NOT NULL述語は、列指定のみに定義されます。
原因: IS NULLおよびIS NOT NULL述語は、列指定のみに定義され、その他の式には定義されません。5.15項「<null predicate>」には、述語「x IS NULL」のxは列である必要があり、その他の種類の式であってはならないことが示されています。
原因: 文字列をソースから宛先へ移動中にエラーが発生しました。このエラーは、たとえば10文字の文字列を1文字のバッファへ移動しようとすると発生します。このエラーの原因は、常に自明であるとはかぎりません。たとえば、次のような場合にエラーが発生します。a varchar2(1); b number; b := 10; a := b; 数値の10が文字列の10に暗黙的に変換され、これが変数aに割り当てられた1文字分のバッファに格納できないため、エラーが発生します。
原因: コピーまたは代入する数値の小数点の左側にある桁が多すぎるため、宛先に格納できません。つまり、数値の精度が一致していません。たとえば、次のように文字列を数値に代入しようとするときにも、このエラーが発生します。a varchar2(4); b number(1,1); a := '10.1'; b := a;