Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 execute immediate и ошибка ORA-01747  [new]
Zumbi
Member

Откуда:
Сообщений: 7
Здравствуйте, уважаемые участники.
Столкнулся с такой ошибкой: имеется пакет с вызовом такого типа:

procedure SetTableAttribute(
      idpSelf in number,
      spAttributeName in String,
      spValue in String)
  is
  begin
...
execute immediate 'update SomeKindOfTable set ' || spAttributeName || ' = ' || spValue || ' where id = :idpSelf' using idpSelf;
...
end;

Происходит ошибка:
ORA-01747: неверные спецификации для user.table.column, table.column или column

Т.е. Оракл пытается сказать, что у меня что-то не то с именем колонки в динамическом SQL. Однако имя колонки приходит однозначно верное, и если выполнить этот запрос не как динамический, а как обычный, то ошибок не возникает.

Может, кто-нибудь сталкивался с такой проблемой? Заранее спасибо за подсказку, бьюсь уже не первый день.

Да, исходной код не мой, править его я, можно сказать, что не могу - системный функционал ERP-системы.
3 дек 08, 13:42    [6519123]     Ответить | Цитировать Сообщить модератору
 Re: execute immediate и ошибка ORA-01747  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
очевидно - вы же строку свою суете в dml безкавычиков
(а чёбы юзингом и вставляемое значение не передать?)
3 дек 08, 13:46    [6519155]     Ответить | Цитировать Сообщить модератору
 Re: execute immediate и ошибка ORA-01747  [new]
pkuzmich
Member

Откуда:
Сообщений: 90
если бы дело было в кавычках то вылетела бы
ORA-00922: missing or invalid option
3 дек 08, 13:50    [6519197]     Ответить | Цитировать Сообщить модератору
 Re: execute immediate и ошибка ORA-01747  [new]
pkuzmich
Member

Откуда:
Сообщений: 90
тут чтото другое, но кавычки полюбому нужны
3 дек 08, 13:52    [6519209]     Ответить | Цитировать Сообщить модератору
 Re: execute immediate и ошибка ORA-01747  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18484
tst> create table t1("date" date);

Table created.

tst> insert into t1 values(sysdate);

1 row created.

tst> update t1 set date = sysdate;
update t1 set date = sysdate
              *
ERROR at line 1:
ORA-01747: invalid user.table.column, table.column, or column specification

3 дек 08, 13:57    [6519255]     Ответить | Цитировать Сообщить модератору
 Re: execute immediate и ошибка ORA-01747  [new]
Zumbi
Member

Откуда:
Сообщений: 7
Вячеслав Любомудров,

Имя колонки у меня = fQtyWrtBsUnit. Так что вроде бы не этот случай.

orawish,

С кавычками не понял - где их, по-Вашему, не хватает? В любом случае, очень в этом сомневаюсь...
3 дек 08, 14:09    [6519388]     Ответить | Цитировать Сообщить модератору
 Re: execute immediate и ошибка ORA-01747  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
Zumbi
Вячеслав Любомудров,

Имя колонки у меня = fQtyWrtBsUnit. Так что вроде бы не этот случай.

orawish,

С кавычками не понял - где их, по-Вашему, не хватает? В любом случае, очень в этом сомневаюсь...

а вы не сомневайтесь, а выведите ваш dml напр. dbms_output-ом
3 дек 08, 14:24    [6519552]     Ответить | Цитировать Сообщить модератору
 Re: execute immediate и ошибка ORA-01747  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
прошу пардону. не кавычки, а апострофы, конечно (склероз )
3 дек 08, 14:38    [6519693]     Ответить | Цитировать Сообщить модератору
 Re: execute immediate и ошибка ORA-01747  [new]
zhal
Member

Откуда: Киев-Харьков
Сообщений: 647
Zumbi
Вячеслав Любомудров,

Имя колонки у меня = fQtyWrtBsUnit. Так что вроде бы не этот случай.

orawish,

С кавычками не понял - где их, по-Вашему, не хватает? В любом случае, очень в этом сомневаюсь...


Эта эта ошибка говорит именно об использовании Reserved_words

Все-таки попробуйте

execute immediate 'update SomeKindOfTable set "' || spAttributeName || '" = ''' || spValue || ''' where id = :idpSelf' using idpSelf;

3 дек 08, 14:56    [6519848]     Ответить | Цитировать Сообщить модератору
 Re: execute immediate и ошибка ORA-01747  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
zhal
..

Эта эта ошибка говорит именно об использовании Reserved_words

..

SQL> set serveroutput on
SQL> declare
  2    spAttributeName String(30) := 'fQtyWrtBsUnit';
  3    spValue String(1000) := 'ёлы палы, тута может быть еррор и от резервед ворд и от тёти моти';
  4    a_dml varchar2(4000);
  5  begin
  6    a_dml := 'update SomeKindOfTable set ' || spAttributeName || ' = ' || spValue || ' where id =
  7    dbms_output.put_line(a_dml);
  8  end;
  9  /
update SomeKindOfTable set fQtyWrtBsUnit = ёлы палы, тута может быть еррор и от
резервед ворд и от тёти моти where id = :idpSelf
3 дек 08, 15:03    [6519916]     Ответить | Цитировать Сообщить модератору
 Re: execute immediate и ошибка ORA-01747  [new]
zhal
Member

Откуда: Киев-Харьков
Сообщений: 647
orawish

SQL> set serveroutput on
SQL> declare
  2    spAttributeName String(30) := 'fQtyWrtBsUnit';
  3    spValue String(1000) := 'ёлы палы, тута может быть еррор и от резервед ворд и от тёти моти';
  4    a_dml varchar2(4000);
  5  begin
  6    a_dml := 'update SomeKindOfTable set ' || spAttributeName || ' = ' || spValue || ' where id =
  7    dbms_output.put_line(a_dml);
  8  end;
  9  /
update SomeKindOfTable set fQtyWrtBsUnit = ёлы палы, тута может быть еррор и от
резервед ворд и от тёти моти where id = :idpSelf


В Вашем случае возникает другая ошибка ORA-00933: SQL command not properly ended.
3 дек 08, 15:13    [6520035]     Ответить | Цитировать Сообщить модератору
 Re: execute immediate и ошибка ORA-01747  [new]
Elic
Member

Откуда:
Сообщений: 29988
zhal
В Вашем случае возникает другая ошибка ORA-00933: SQL command not properly ended.
Да пофигу, какая ошибка возникнет. Главное увидеть, что ж там за хрень, чтоб не гадать на кофейной гуще.
3 дек 08, 15:22    [6520105]     Ответить | Цитировать Сообщить модератору
 Re: execute immediate и ошибка ORA-01747  [new]
Серафимный Шестикрыл
Member [заблокирован]

Откуда: С луны свалился
Сообщений: 2922
zhal
Все-таки попробуйте

execute immediate 'update SomeKindOfTable set "' || spAttributeName || '" = ''' || spValue || ''' where id = :idpSelf' using idpSelf;



Я бы сказал, что использовать в SET конкатенацию, и тут же рядом в WHERE - связную переменную - более чем забавно
3 дек 08, 15:37    [6520200]     Ответить | Цитировать Сообщить модератору
 Re: execute immediate и ошибка ORA-01747  [new]
Zumbi
Member

Откуда:
Сообщений: 7
zhal
Zumbi
Вячеслав Любомудров,

Имя колонки у меня = fQtyWrtBsUnit. Так что вроде бы не этот случай.

orawish,

С кавычками не понял - где их, по-Вашему, не хватает? В любом случае, очень в этом сомневаюсь...


Эта эта ошибка говорит именно об использовании Reserved_words

Все-таки попробуйте

execute immediate 'update SomeKindOfTable set "' || spAttributeName || '" = ''' || spValue || ''' where id = :idpSelf' using idpSelf;



Попробовал. Понял Вашу идею. Дело в том, что у меня тип колонки, на которую указывает, spAttributeName, на самом деле численный, и в spValue хранится число, законверченное в строку. Поэтому отсутствие кавычек ничему не мешает. Дело в чём-то другом, наверное.
4 дек 08, 07:24    [6522369]     Ответить | Цитировать Сообщить модератору
 Re: execute immediate и ошибка ORA-01747  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18484
И все же сделай:
procedure SetTableAttribute(
      idpSelf in number,
      spAttributeName in String,
      spValue in String)
  is
STMT varchar2(500);
  begin
...
STMT := 'update SomeKindOfTable set ' || spAttributeName || ' = ' || spValue || ' where id = :idpSelf';
BEGIN
execute immediate STMT  using idpSelf;
EXCEPTION WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE(SQLERRM);
    DBMS_OUTPUT.PUT_LINE(STMT);
   RAISE;
END:
...
end;
Только вывод разреши (set serveroutput on)
И покажи что будет при ошибке
4 дек 08, 07:29    [6522374]     Ответить | Цитировать Сообщить модератору
 Re: execute immediate и ошибка ORA-01747  [new]
Zumbi
Member

Откуда:
Сообщений: 7
Вячеслав Любомудров
И все же сделай:
procedure SetTableAttribute(
      idpSelf in number,
      spAttributeName in String,
      spValue in String)
  is
STMT varchar2(500);
  begin
...
STMT := 'update SomeKindOfTable set ' || spAttributeName || ' = ' || spValue || ' where id = :idpSelf';
BEGIN
execute immediate STMT  using idpSelf;
EXCEPTION WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE(SQLERRM);
    DBMS_OUTPUT.PUT_LINE(STMT);
   RAISE;
END:
...
end;
Только вывод разреши (set serveroutput on)
И покажи что будет при ошибке


Получилось вот что:

ORA-01747: неверные спецификации для user.table.column, table.column или column
update SomeKindOfTable set fQtyWrtBsUnit = 203,4 where id = :idpSelf

Проблема в том, что разделитель в числе - запятая?
4 дек 08, 08:23    [6522452]     Ответить | Цитировать Сообщить модератору
 Re: execute immediate и ошибка ORA-01747  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18484
Да
tst> create table t1 as select 12.3456 a from dual;

Table created.

tst> update t1 set a=12,3456;
update t1 set a=12,3456
                   *
ERROR at line 1:
ORA-01747: invalid user.table.column, table.column, or column specification

4 дек 08, 08:31    [6522463]     Ответить | Цитировать Сообщить модератору
 Re: execute immediate и ошибка ORA-01747  [new]
Zumbi
Member

Откуда:
Сообщений: 7
Вячеслав Любомудров
Да
tst> create table t1 as select 12.3456 a from dual;

Table created.

tst> update t1 set a=12,3456;
update t1 set a=12,3456
                   *
ERROR at line 1:
ORA-01747: invalid user.table.column, table.column, or column specification



А проблема-то оказалась красивее, чем кажется на первый взгляд. Данная ошибка возникала только при вызове нужной процедуры из PL/SQL Developer'а, а в самой ERP-системе всё отрабатывало корректно. А дело в том, что в ERP выполнялась команда

execute immediate 'alter session set NLS_NUMERIC_CHARACTERS = ''. ''';

А у меня в Девелопере - нет. После выполнения этой команды мне стали приходить строки с разделителем-точкой и всё заработало.

Всем спасибо за помощь. :)
4 дек 08, 08:49    [6522509]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить