以下是我在动态传递身份列名称(因为每次都不知道身份名称)时执行插入操作时如何获取最后一个身份值的方法。
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;
/
答案 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提供运行时列名称(或任何其他对象标识符)。