ORA-01722: неверный номер с возвратом в DML - PullRequest
0 голосов
/ 15 января 2019

Ниже показано, как я получаю последнее значение идентификатора, когда выполняю вставку, динамически передавая имя столбца идентификатора (потому что я не знаю, как называется идентификатор каждый раз.)

set serveroutput on
/
DROP TABLE TEST_T
/
CREATE TABLE TEST_T
(
  TEST_ID NUMBER GENERATED ALWAYS AS IDENTITY ,
    NAME VARCHAR2(100)
)
/
DECLARE table_NAME_Id VARCHAR2(100);
trx_id NUMBER(4);
begin
table_NAME_Id:='TEST_ID';

  EXECUTE IMMEDIATE '
INSERT INTO TEST_T
(NAME)
VALUES
(''TEST'')
 RETURNING '||table_NAME_Id||' INTO :trx_id'
  RETURNING INTO trx_id;

dbms_output.put_line('ID: ' || trx_id);

END;
/
COMMIT
/

Однако, если я сделаю это таким образом, это выдаст мне ошибку, может быть, потому что оракул хочет столбец, а я предоставляю переменную? или в чем причина этой ошибки? это мой вопрос и есть ли другой способ решить эту ошибку с помощью функции преобразования, отличной от вышеуказанного способа?

ORA-01722: invalid number
ORA-06512: at line 8

--THE BELOW IS THROWING THE ABOVE ERROR, WHY?
DECLARE table_NAME_Id VARCHAR2(100);
trx_id NUMBER(4);
begin
table_NAME_Id:='TEST_ID';


INSERT INTO TEST_T
(NAME)
VALUES
('TEST')
 RETURNING table_NAME_Id INTO trx_id;


dbms_output.put_line('ID: ' || trx_id);

END;
/

1 Ответ

0 голосов
/ 15 января 2019

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

DECLARE
  table_NAME_Id VARCHAR2(100);
  trx_id NUMBER(4);
BEGIN
  table_NAME_Id:='42';

  INSERT INTO TEST_T
  (NAME)
  VALUES
  ('TEST')
  RETURNING table_NAME_Id INTO trx_id;

  dbms_output.put_line('ID: ' || trx_id);
END;
/

ID: 42

PL/SQL procedure successfully completed.

С переменной, установленной на ваше первоначальное значение, он пытается сделать неявное TO_NUMBER('TEST_ID'), которое всегда будет выбрасывать ORA-01722.

Хотя Разрешение имени PL / SQL означает, что имя столбца имеет приоритет над именем переменной, это здесь не поможет, поскольку нет столбца с именем TABLE_NAME_ID - поэтому он с радостью использует переменную.

Нельзя использовать значение переменной вместо имени столбца. Вы должны использовать динамический SQL для предоставления имени столбца времени выполнения (или любого другого идентификатора объекта).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...