ORA-01747: недопустимый пользователь.таблица.колонка, стол.столбец или спецификация столбца

получите вышеуказанную ошибку, когда 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;

8 ответов


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

не видя определения таблицы для 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: в последнее время (у некоторых людей есть особые таланты) мне удается получить такое же исключение с новым подходом:

update TABLE_NAME set COLUMN1=7, set COLUMN2=8

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


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


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

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

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

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


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

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

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

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

и я писал запрос. Мне пришлось удалить [ и ]

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

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


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