Oracle ORA-01722:在DML中使用返回的数字无效
下面是我在动态传递标识列的名称时执行insert时如何获取最后一个标识值,因为我不知道每次标识的名称Oracle ORA-01722:在DML中使用返回的数字无效,oracle,Oracle,下面是我在动态传递标识列的名称时执行insert时如何获取最后一个标识值,因为我不知道每次标识的名称 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
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
/
然而,如果我这样做,它会给我一个错误,可能是因为oracle需要一个列,而我提供了一个变量?或者这一错误的原因是什么?这是我的问题。除了上述方法,还有没有其他方法可以用转换函数来解决这个错误
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;
/
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_编号'TEST_ID',该编号始终将抛出ORA-01722
虽然这意味着列名优先于变量名,但这在这里没有帮助,因为没有名为TABLE_name_ID的列,所以它很乐意使用变量
它不能使用变量的值代替列名。必须使用动态SQL来提供运行时列名或任何其他对象标识符