Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle ORA-01722:在DML中使用返回的数字无效_Oracle - Fatal编程技术网

Oracle ORA-01722:在DML中使用返回的数字无效

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

下面是我在动态传递标识列的名称时执行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
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来提供运行时列名或任何其他对象标识符