2012-02-27 1 views
6

Получить выше ошибка, когда выполнить немедленное вызывается в циклеORA-01747: неверная спецификация user.table.column, table.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; 

ответ

4

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

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

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

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

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

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

6

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

+1

В моем случае у меня была конечная запятая ',' в инструкции 'insert'. –

+1

В моем случае имя столбца зарезервировано. – Chirag

+0

Отлично, как все эти совершенно разные проблемы создают одно и то же сообщение об ошибке. Это не так, как если бы парсер не знал, что пошло не так (на котором была проверка), инженеры были слишком ленивы, чтобы создавать более конкретные сообщения об ошибках. – masterxilo

17

проверьте свой запрос для двойной запятой.

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

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


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

update TABLE_NAME set COLUMN1=7, set COLUMN2=8 

(второй SET является избыточным)

+0

объясните свой ответ хотя бы двумя или более строками , для лучшего понимания. – Hamad

+0

Спасибо. Я добавил дополнительную запятую перед первой закрывающей скобкой). Oracle, похоже, не беспокоится о предоставлении хороших сообщений об ошибках. – masterxilo

1

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

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

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

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

0

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

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

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

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

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

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

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