ループで即時実行が呼び出されたときに上記のエラーを取得する
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;
引用符で囲まれていない識別子は、アルファベット文字で始まる必要があります( rule 6 here を参照)。番号が1AO00
、1AP00
などで始まる名前の列に値を割り当てようとしています。
CustomersPriceGroups
のテーブル定義がなければ、それらの名前の列があるかどうかはわかりません。その場合は、引用識別子として作成されている必要があります。その場合、(どこでも)引用符でそれらを参照する必要がありますが、これは理想的ではありません-コードを少し読みにくくし、このような間違いを犯しやすくし、何が間違っているのか見つけるのが難しい場合があります。オラクルでさえ、同じページでこう言います:
注:Oracleでは、データベースオブジェクト名に引用符で囲まれた識別子を使用することはお勧めしません。これらの引用識別子はSQL * Plusで受け入れられますが、データベースオブジェクトを管理する他のツールを使用する場合は無効になる場合があります。
コードでは、sQ
を割り当てるときに引用符を使用しているように見えますが、表示する出力はそうではありません。ただし、saap.
スキーマ識別子もありません。考えているバージョンのコードを実行していないからかもしれませんが、データを貼り付けるのではなく再入力すると失われただけかもしれません-c.cuno
の以前の出力も表示されていません。しかし、たとえば、列名が間違っている場合もあります。
execute
がエラーをスローしている場合、デバッグの後にコマンドが実行されるため、ループ中にコマンドが実行されることはありません。破損している値ではなく、成功した値が表示されます。関数によって返されるすべての値を確認する必要があります。 g
は、実際には有効な列名ではないcpgs
の値を返していると思われます。
@ninesidedが言うように、より多くの情報、特に完全な例外メッセージを表示すると、何が問題なのかを特定するのに役立ちます。
クエリで二重カンマを確認してください。
insert into TABLE_NAME (COLUMN1, COLUMN2,,COLUMN3) values(1,2,3);
(COLUMN2の後に余分なコンマがあります)。
更新:最近(一部の人々は特別な才能を持っています)私は新しいアプローチで同じ例外を得ることに成功しました:
update TABLE_NAME set COLUMN1=7, set COLUMN2=8
(2番目のSETは冗長です)
これは、Oracleパーサーが列の1つが無効であると判断することを意味します。これは、列を誤って参照したか、列名が予約語であるか、またはUPDATE
ステートメントに構文エラーがあり、Oracleが列ではない何かを列であると見なすためです。 。実行されている完全なステートメント、CustomersPriceGroups
テーブルの定義、および発生している例外のフルテキストを確認すると、多くの場合()列が故障して。
setステートメントの最後に、構文エラーの代わりに余分な「、」を追加すると、ORA-01747になります。これは、Oracleからは非常に奇妙です。
update table1
set col1 = 'Y', --this odd 1
where col2 = 123
and col3 = 456
ここの他の回答で引用された理由に加えて、Oracleデータベースで特別な/予約語とみなされる名前がテーブルの列名にないことを確認する必要がある場合もあります。
私の場合、テーブル列名はuidでした。 uidはOracleの予約語であるため、このエラーが発生していました。
幸いなことに、私のテーブルは新しいテーブルであり、データがありませんでした。 Oracle DROP tableコマンドを使用してテーブルを削除し、問題の列の名前を変更した新しいテーブルを作成できました。
また、Oracleが私を許可せず、エラーをスローし続けるため、問題の列の名前を変更するのに苦労しました。
そして、私は次のようなクエリを書いていました。 [
と]
を削除する必要がありました
UPDATE SN.TableName
SET [EXPIRY_DATE] = systimestamp + INTERVAL '12' HOUR,
WHERE [USER_ID] ='12345'
最近、SQL ServerからOracleに移行しました。
原因は、たとえばselectの場合とは異なる一連の列でグループ化した場合も考えられます。
select tab.a, tab.b, count(*)
from ...
where...
group by tab.a, tab.c;
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が同じ場合、クエリは正常に実行されます。
SQLステートメントでOracleキーワードを使用した
私にとって、この問題は、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