什么是PLSQL(Oracle)相当于这个SQL服务器片段?
BEGIN TRAN
INSERT INTO mytable(content) VALUES ("test") -- assume there's an ID column that is autoincrement
SELECT @@IDENTITY
COMMIT TRAN
Run Code Online (Sandbox Code Playgroud)
在C#中,您可以调用myCommand.ExecuteScalar()来检索新行的ID.
如何在Oracle中插入新行,让JDBC获取新ID的副本?
编辑: BalusC提供了一个非常好的起点.由于某种原因,JDBC不喜欢命名参数绑定.这给出了"错误设置或注册的参数"SQLException.为什么会这样?
OracleConnection conn = getAppConnection();
String q = "BEGIN INSERT INTO tb (id) values (claim_seq.nextval) returning id into :newId; end;" ;
CallableStatement cs = (OracleCallableStatement) conn.prepareCall(q);
cs.registerOutParameter("newId", OracleTypes.NUMBER);
cs.execute();
int newId = cs.getInt("newId");
Run Code Online (Sandbox Code Playgroud) 可能重复:
PLSQL JDBC:如何获取最后一行ID?
我从表中获取ID时遇到问题.我有两个表AJPES_TR和TR_LOG,并且TR_LOG表中的PK被设置为AJPES_TR表中的外键.
在TR_LOG表中,我只是编写从哪个文件数据导入,我想将该PK链接到主表.在mySQL中我做得很好getID.last(); int j = getID.getInt(TR_LOG_ID);但是现在在Oracle中这已不再适用了.
这些是我的PreparedStatements:
PreparedStatement insertData =
con.prepareStatement(
"INSERT INTO T_AJPES_TR(rn,sSpre,reg,eno,davcna,Ime,Priimek) VALUES (?,?,?,?,?,?,?)"
);
PreparedStatement select_file_log =
con.prepareStatement("SELECT * FROM T_AJPES_TR_LOG WHERE File_import = ?"
);
PreparedStatement getID = con.prepareStatement("SELECT * FROM T_AJPES_TR_LOG");
PreparedStatement insertFile =
con.prepareStatement(
"INSERT INTO T_AJPES_TR_LOG(Date_import,File_import) VALUES (?,?)"
);
Run Code Online (Sandbox Code Playgroud)
在mySQL中,ID被设置为自动增量.
如何从TR_LOG获取ID值并在AJPES_TR表中写入该值?
我刚开始使用Oracle,所以我将在之前回答过这个问题.我似乎无法让它工作.这是我正在使用的声明:
declare
lastId number;
begin
INSERT INTO "DB_OWNER"."FOO"
(ID, DEPARTMENT, BUSINESS)
VALUES (FOO_ID_SEQ.NEXTVAL, 'Database Management', 'Oracle')
RETURNING ID INTO lastId;
end;
Run Code Online (Sandbox Code Playgroud)
当我调用executeQuery我所做的PreparedStatement时,它会将所有内容都插入到数据库中.但是,我似乎无法弄清楚如何检索ID.返回的ResultSet对象对我不起作用.调用
if(resultSet.next()) ...
Run Code Online (Sandbox Code Playgroud)
产生令人讨厌的SQLException,其内容如下:
无法在PLSQL语句上执行提取:下一步
我怎么做到的lastId?显然我做错了.