ORA-01747: неверная спецификация user.table.column, table.column или столбца - PullRequest
11 голосов
/ 27 февраля 2012

Получите вышеупомянутую ошибку, когда немедленное выполнение вызывается в цикле

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;

Ответы [ 9 ]

25 голосов
/ 21 ноября 2013

проверьте ваш запрос на двойную запятую.

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

(после COLUMN2 есть лишняя запятая).


Обновление: недавно (у некоторых людей есть особые таланты) мне удается получить то же исключение с новым подходом:

update TABLE_NAME set COLUMN1=7, set COLUMN2=8

(второй SET избыточен)

6 голосов
/ 27 февраля 2012

Идентификаторы без кавычек должны начинаться с буквенного символа (см. правило 6 здесь ).Вы пытаетесь присвоить значение столбцу с именем, начинающимся с числа 1AO00, 1AP00 и т. Д.

Не видя определения таблицы для CustomersPriceGroups, мы не знаем, имеет ли оностолбцы с этими именами.Если это так, то они должны быть созданы как идентификаторы в кавычках.Если это так, вам придется ссылаться на них (везде) с кавычками, что не является идеальным - делает код немного сложнее для чтения, позволяет легко допустить такую ​​ошибку и может быть трудно определить, что не так.Даже Oracle говорит, на той же странице:

Примечание: Oracle не рекомендует использовать идентификаторы в кавычках для имен объектов базы данных.Эти идентификаторы в кавычках принимаются SQL * Plus, но они могут быть недопустимыми при использовании других инструментов, управляющих объектами базы данных.

В вашем коде вы используете кавычки при назначении sQ,но вывод, который вы показываете, не делает;но он также не имеет идентификатора схемы saap..Это может быть из-за того, что вы не используете ту версию кода, о которой думаете, но, возможно, просто потерялись, если перепечатали данные, а не вставили их - вы также не показывает более ранний вывод c.cuno.Но также возможно, что вы, например, неправильно указали имя столбца.

Если execute выдает ошибку, вы не увидите команду, выполняемую в этот раз в цикле, потому что отладкаприходит после этого - вы видите успешные ценности, а не те, которые ломают.Вам необходимо проверить все значения, возвращаемые функциями;Я подозреваю, что g возвращает значение для cpgs, которое на самом деле не является допустимым именем столбца.

Как говорит @ninesided, показ дополнительной информации, особенно полное сообщение об исключении, поможет определить, что не так.

6 голосов
/ 27 февраля 2012

Это означает, что анализатор Oracle считает, что один из ваших столбцов недопустим.Это может быть из-за того, что вы неправильно сослались на столбец, имя столбца является зарезервированным словом, или из-за синтаксической ошибки в операторе UPDATE, которая заставляет Oracle думать, что что-то, что не является столбцом, является столбцом.Это действительно поможет увидеть полный выполняемый оператор, определение таблицы CustomersPriceGroups и полный текст создаваемого исключения, так как он часто сообщает , какой столбец виноват.

1 голос
/ 07 сентября 2017

И я писал запрос, как. Я должен был удалить [ и ]

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

Мы недавно перешли с SQL Server на Oracle.

1 голос
/ 17 марта 2017

если вы добавите дополнительный «,» в конце оператора set вместо синтаксической ошибки, вы получите ORA-01747, что очень странно для Oracle например,

  update table1 
  set col1 = 'Y', --this odd 1
  where col2 = 123
  and col3 = 456 
1 голос
/ 03 июня 2016

В дополнение к причинам, приведенным здесь в других ответах, вам также может понадобиться проверить, что ни одно из имен столбцов вашей таблицы не имеет имени, которое считается специальным / зарезервированным словом в базе данных oracle.

В моем случае у меня было имя столбца таблицы uid.uid - зарезервированное слово в oracle, и поэтому я получаю эту ошибку.

К счастью, моя таблица была новой таблицей, и у меня не было данных в ней.Я смог использовать команду Oracle DROP table, чтобы удалить таблицу и создать новую с измененным именем для столбца проблемы.

У меня также были проблемы с переименованием столбца проблемы, поскольку oracle не позволил мнеи продолжал бросать ошибки.

0 голосов
/ 17 июля 2019

ORA-01747: недопустимый user.table.column, table.column или column спецификация

Вы получите, если пропустите соотношение столбцов, когда вы сравните оба идентификатора столбца, то ваш идентификатор не будет одинаковым, проверьте оба идентификатора в вашей базе данных. Вот пример примера, с которым я столкнулся:

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

здесь Проблема, которую вы получите, когда 'CHECK_CONDITION' и 'ID' оба идентификатора столбца не будут одинаковыми Если на этот раз оба идентификатора будут одинаковыми, ваш запрос будет выполнен нормально, проверьте идентификаторы обоих столбцов, которые вы сравниваете в своем коде.

0 голосов
/ 06 августа 2018

Вы использовали ключевое слово oracle в своей инструкции SQL

0 голосов
/ 14 июля 2017

Причина также может быть в том, что вы группируете набор столбцов, отличный от выбранного, например:

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