ORA-01722:在DML中使用回车号无效

时间:2019-01-15 16:54:02

标签: oracle

以下是我在动态传递身份列名称(因为每次都不知道身份名称)时执行插入操作时如何获取最后一个身份值的方法。

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;
/

1 个答案:

答案 0 :(得分:1)

Oracle确实需要一列,但是它抛出该特定错误,因为它试图将let audioSession = AVAudioSession.sharedInstance() do { try audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord, with: .defaultToSpeaker) try audioSession.setActive(true) } catch let error as NSError { configureAudioSessionError = error } 变量的 value 隐式转换为数字。您可以看到是否更改了该值:

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. ,这总是会引发ORA-01722。

尽管PL/SQL name resolution意味着列名优先于变量名,但这在这里无济于事,因为没有名为TO_NUMBER('TEST_ID')的列-因此它很高兴使用变量。

它不能使用变量的 value 代替列名。您必须使用动态SQL提供运行时列名称(或任何其他对象标识符)。