web-dev-qa-db-ja.com

ORA-01747:user.table.column、table.columnまたは列の指定が無効です

ループで即時実行が呼び出されたときに上記のエラーを取得する

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;
11
TonyP

引用符で囲まれていない識別子は、アルファベット文字で始まる必要があります( rule 6 here を参照)。番号が1AO001AP00などで始まる名前の列に値を割り当てようとしています。

CustomersPriceGroupsのテーブル定義がなければ、それらの名前の列があるかどうかはわかりません。その場合は、引用識別子として作成されている必要があります。その場合、(どこでも)引用符でそれらを参照する必要がありますが、これは理想的ではありません-コードを少し読みにくくし、このような間違いを犯しやすくし、何が間違っているのか見つけるのが難しい場合があります。オラクルでさえ、同じページでこう言います:

注:Oracleでは、データベースオブジェクト名に引用符で囲まれた識別子を使用することはお勧めしません。これらの引用識別子はSQL * Plusで受け入れられますが、データベースオブジェクトを管理する他のツールを使用する場合は無効になる場合があります。

コードでは、sQを割り当てるときに引用符を使用しているように見えますが、表示する出力はそうではありません。ただし、saap.スキーマ識別子もありません。考えているバージョンのコードを実行していないからかもしれませんが、データを貼り付けるのではなく再入力すると失われただけかもしれません-c.cunoの以前の出力も表示されていません。しかし、たとえば、列名が間違っている場合もあります。

executeがエラーをスローしている場合、デバッグの後にコマンドが実行されるため、ループ中にコマンドが実行されることはありません。破損している値ではなく、成功した値が表示されます。関数によって返されるすべての値を確認する必要があります。 gは、実際には有効な列名ではないcpgsの値を返していると思われます。

@ninesidedが言うように、より多くの情報、特に完全な例外メッセージを表示すると、何が問題なのかを特定するのに役立ちます。

6
Alex Poole

クエリで二重カンマを確認してください。

insert into TABLE_NAME (COLUMN1, COLUMN2,,COLUMN3) values(1,2,3);

(COLUMN2の後に余分なコンマがあります)。


更新:最近(一部の人々は特別な才能を持っています)私は新しいアプローチで同じ例外を得ることに成功しました:

update TABLE_NAME set COLUMN1=7, set COLUMN2=8

(2番目のSETは冗長です)

26
yurin

これは、Oracleパーサーが列の1つが無効であると判断することを意味します。これは、列を誤って参照したか、列名が予約語であるか、またはUPDATEステートメントに構文エラーがあり、Oracleが列ではない何かを列であると見なすためです。 。実行されている完全なステートメント、CustomersPriceGroupsテーブルの定義、および発生している例外のフルテキストを確認すると、多くの場合()列が故障して。

7
ninesided

setステートメントの最後に、構文エラーの代わりに余分な「、」を追加すると、ORA-01747になります。これは、Oracleからは非常に奇妙です。

  update table1 
  set col1 = 'Y', --this odd 1
  where col2 = 123
  and col3 = 456 
1
Junchen Liu

ここの他の回答で引用された理由に加えて、Oracleデータベースで特別な/予約語とみなされる名前がテーブルの列名にないことを確認する必要がある場合もあります。

私の場合、テーブル列名はuidでした。 uidはOracleの予約語であるため、このエラーが発生していました。

幸いなことに、私のテーブルは新しいテーブルであり、データがありませんでした。 Oracle DROP tableコマンドを使用してテーブルを削除し、問題の列の名前を変更した新しいテーブルを作成できました。

また、Oracleが私を許可せず、エラーをスローし続けるため、問題の列の名前を変更するのに苦労しました。

1
Abhi Rampal

そして、私は次のようなクエリを書いていました。 []を削除する必要がありました

UPDATE SN.TableName 
SET [EXPIRY_DATE] = systimestamp + INTERVAL '12' HOUR, 
WHERE [USER_ID] ='12345'

最近、SQL ServerからOracleに移行しました。

1
Jaikrat

原因は、たとえばselectの場合とは異なる一連の列でグループ化した場合も考えられます。

select tab.a, tab.b, count(*)
from ...
where...
group by tab.a, tab.c;
0
Rafał

ORA-01747:user.table.column、table.columnまたは列の指定が無効です

両方の列IDを比較すると、列の関係を見逃したときに取得されます。データベースの両方のIDを同じにチェックすることはできません。

UPDATE TABLE_NAME SET APPROVED_BY='1000',CHECK_CONDITION=ID, WHERE CONSUMER_ID='200'

here「CHECK_CONDITION」と「ID」の両方の列IDが同じではない場合に発生する問題この2つのIDが同じ場合、クエリは正常に実行されます。

0
Abhijit Patra

SQLステートメントでOracleキーワードを使用した

0
Alireza Alallah

私にとって、この問題は、Oracleの予約語である列名「CLUSTER」に使用するためでした。列に挿入しようとしていました。列の名前を変更すると、問題が修正されました。

insert into table (JOB_NAME, VERSION, CLUSTER, REPO, CREATE_TS) VALUES ('abc', 169, 'abc.war', '1.3', 'test.com', 'test', '26-Aug-19 04.27.09.000000949 PM')
Error at Command Line : 1 Column : 83
Error report -
SQL Error: ORA-01747: invalid user.table.column, table.column, or column specification
0
Upen