1. ホーム
  2. oracle

[解決済み] ORA-01747:user.table.column, table.column, または column の指定が無効です。

2022-02-17 10:06:42

質問

ループ内でexecute immediateを呼び出すと、上記のエラーが発生する。

Update CustomersPriceGroups set  1AO00=:disc  Where cuno=:cuno
    Parameters:   disc=66 cuno=000974
Update CustomersPriceGroups set  1AP00=:disc  Where cuno=:cuno
    Parameters:   disc=70.5 cuno=000974
Update CustomersPriceGroups set  1AQ00=:disc  Where cuno=:cuno
    Parameters:   disc=66 cuno=000974
Update CustomersPriceGroups set  1ZA00=:disc  Where cuno=:cuno
    Parameters:   disc=60 cuno=000974

これはどういう意味ですか?

以下はそのコードです。

    c:=PriceWorx.frcPriceListCustomers('020','221');
LOOP
  fetch c into comno,cuno,nama,cpls;
  exit when c%notfound;
  dbms_output.put_Line(cuno);
   g:=priceWorx.frcPriceListItemGroups('020','221');
   d:=priceworx.frcCustomerDiscounts('020','221',cuno);
  loop
    fetch g into comno,cpgs,n;
    fetch d into comno,cpls,cuno,cpgs,stdt,tdat,qanp,disc,src;
    --dbms_output.put(chr(9)||cpgs);
    sQ:='Update saap.CustomersPriceGroups set "'|| trim(cpgs)||'"=:disc '
       || ' Where cuno=:cuno';
    execute immediate sQ using disc,cuno; 
    commit;
    dbms_output.put_line( sQ );
    dbms_output.put_line( chr(9)||'Parameters:   disc='|| disc||' cuno='||cuno);
    exit when g%notfound;
  end loop;
  close g;
  close d;
end loop;

解決方法は?

引用されていない識別子は、アルファベットで始めなければなりません ( ルール6 ). 数字で始まる名前を持つカラムに値を代入しようとしています。 1AO00 , 1AP00 などです。

のテーブル定義を見ずに CustomersPriceGroups そのような名前のカラムがあるかどうかはわかりません。もしあるのなら、それらは引用符で囲まれた識別子として作成されているはずです。その場合、(どこでも)引用符で囲んで参照しなければなりませんが、これは理想的ではありません。同じページのOracleでさえもです。

<ブロッククオート

注:オラクルでは、引用符で囲まれた識別子をデータベース オブジェクト名です。これらの引用符で囲まれた識別子は、SQL*Plus では受け入れられますが を管理する他のツールを使用する場合、有効でない可能性があります。 オブジェクトを作成します。

このコードでは、引用符を使って sQ しかし、あなたが示した出力はそうではありません。 saap. スキーマ識別子も同じです。それは、あなたが考えているコードのバージョンを実行していないからかもしれません。 の出力が表示されないのは、データを貼り付ける代わりに再入力した場合に失われるからです。 c.cuno もあります。でも、例えばカラム名の大文字と小文字を間違えている可能性もありますね。

もし execute デバッグはその後に行われるため、ループ内でそのコマンドが実行されるのを見ることはできません - 正常な値を見ているのであって、壊れている値を見ているのではありません。関数から返されるすべての値をチェックする必要があります。 g が返す値は cpgs というのは、実は有効なカラム名ではありません。

ninesided が言うように、より多くの情報、特に完全な例外メッセージを表示することで、何が間違っているのかを特定するのに役立ちます。