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