ORA-01747: недопустимые параметры user.table.column, table.column или 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;
Ответы
Ответ 1
Идентификаторы без кавычек должны начинаться с буквенного символа (см. Правило 6 здесь). Вы пытаетесь присвоить значение столбцу с именем, начинающимся с номера 1AO00
, 1AP00
и т.д.
Не видя определения таблицы для CustomersPriceGroups
мы не знаем, есть ли в нем столбцы с этими именами. Если это так, то они должны быть созданы как идентификаторы в кавычках. Если это так, вам придется ссылаться на них (везде) с кавычками, что не является идеальным - делает код немного сложнее для чтения, позволяет легко допустить такую ошибку и может быть трудно определить, что не так. Даже Оракул говорит, на той же странице:
Примечание. Oracle не рекомендует использовать идентификаторы в кавычках для имен объектов базы данных. Эти идентификаторы в кавычках принимаются SQL * Plus, но они могут быть недействительными при использовании других инструментов, управляющих объектами базы данных.
В вашем коде вы, кажется, используете кавычки, когда назначаете sQ
, но вывод, который вы показываете, не делает; но у него нет saap.
Идентификатор схемы либо. Это может быть из-за того, что вы не используете ту версию кода, о которой думаете, но, возможно, просто потерялись, если перепечатали данные, а не вставили их - вы также не показывает более ранний вывод c.cuno
. Но возможно также, что вы, например, неправильно указали имя столбца.
Если execute
выдает ошибку, вы не увидите команду, выполняемую в этот раз в цикле, потому что отладка идет после нее - вы видите успешные значения, а не те, которые выходят из строя. Вам необходимо проверить все значения, возвращаемые функциями; Я подозреваю, что g
возвращает значение для cpgs
которое на самом деле не является допустимым именем столбца.
Как говорит @ninesided, показ дополнительной информации, особенно полное сообщение об исключении, поможет определить, что не так.
Ответ 2
проверьте свой запрос на двойную запятую.
insert into TABLE_NAME (COLUMN1, COLUMN2,,COLUMN3) values(1,2,3);
(после COLUMN2 есть дополнительная запятая).
Обновление: недавно (у некоторых есть особые таланты), мне удается получить такое же исключение с новым подходом:
update TABLE_NAME set COLUMN1=7, set COLUMN2=8
(второй SET является избыточным)
Ответ 3
Это означает, что парсер Oracle считает, что один из ваших столбцов недопустим. Возможно, это связано с неправильным ссылкой на столбец, имя столбца - зарезервированное слово или из-за того, что в инструкции UPDATE
есть синтаксическая ошибка, которая заставляет Oracle думать, что что-то, что не является столбцом, является столбцом. Это действительно помогло бы увидеть весь выполняемый оператор, определение таблицы CustomersPriceGroups
и полный текст возбуждаемого исключения, поскольку он часто сообщает, какой столбец неисправен.
Ответ 4
В дополнение к причинам, приведенным в других ответах здесь, вам также может потребоваться проверить, что ни одно из имен столбцов таблицы не имеет имени, которое считается специальным/зарезервированным словом в базе данных oracle.
В моем случае у меня было имя столбца таблицы uid. uid - это зарезервированное слово в оракуле, и поэтому я получаю эту ошибку.
К счастью, мой стол был новой таблицей, и у меня не было данных. Я мог использовать команду таблицы OROP оракула, чтобы удалить таблицу и создать новую с измененным именем для столбца проблемы.
У меня также возникли проблемы с переименованием столбца проблемы, поскольку оракул не позволил мне и продолжал бросать ошибки.
Ответ 5
если вы добавите дополнительный "," в конце инструкции set вместо синтаксической ошибки, вы получите ORA-01747, что очень необычно для Oracle
например,
update table1
set col1 = 'Y', --this odd 1
where col2 = 123
and col3 = 456
Ответ 6
И я писал запрос вроде. Мне пришлось удалить [
и ]
UPDATE SN.TableName
SET [EXPIRY_DATE] = systimestamp + INTERVAL '12' HOUR,
WHERE [USER_ID] ='12345'
Недавно мы перешли с SQL Server на Oracle.
Ответ 7
Причиной может быть и при группировке с помощью другого набора столбцов, чем в случае выбора:
select tab.a, tab.b, count(*)
from ...
where...
group by tab.a, tab.c;
Ответ 8
Вы использовали ключевое слово oracle в своем выражении SQL
Ответ 9
ORA-01747: неверная спецификация user.table.column, table.column или столбца
Вы получите, когда пропустите отношение столбца, когда вы сравните оба идентификатора столбца, и ваш идентификатор не будет одинаковым. Проверьте оба идентификатора в вашей базе данных. Вот пример примера, с которым я столкнулся:
UPDATE TABLE_NAME SET APPROVED_BY='1000',CHECK_CONDITION=ID, WHERE CONSUMER_ID='200'
Здесь вы получите сообщение об ошибке, когда 'CHECK_CONDITION' и 'ID' оба идентификатора столбца не будут одинаковыми. Если оба идентификатора будут одинаковыми, на этот раз ваш запрос будет выполнен нормально, проверьте идентификаторы обоих столбцов, которые вы сравниваете в своем коде.
Ответ 10
Для меня проблема была связана с использованием имени столбца "CLUSTER", которое является зарезервированным словом в Oracle. Я пытался вставить в колонку. Переименование столбца устранило мою проблему.
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