Hao*_*est 18 java oracle plsql jdbc
什么是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)
Bal*_*usC 34
通常你可以使用Statement#getGeneratedKeys()它(参见这个例子的答案),但这仍然是(仍然)不支持Oracle JDBC驱动程序.
最好的办法是要么使使用CallableStatement了RETURNING条款:
String sql = "BEGIN INSERT INTO mytable(id, content) VALUES (seq_mytable.NEXTVAL(), ?) RETURNING id INTO ?; END;";
Connection connection = null;
CallableStatement statement = null;
try {
connection = database.getConnection();
statement = connection.prepareCall(sql);
statement.setString(1, "test");
statement.registerOutParameter(2, Types.NUMERIC);
statement.execute();
int id = statement.getInt(2);
// ...
Run Code Online (Sandbox Code Playgroud)
或者在同一笔交易SELECT sequencename.CURRVAL之后开火INSERT:
String sql_insert = "INSERT INTO mytable(content) VALUES (?)";
String sql_currval = "SELECT seq_mytable.CURRVAL FROM dual";
Connection connection = null;
PreparedStatement statement = null;
Statement currvalStatement = null;
ResultSet currvalResultSet = null;
try {
connection = database.getConnection();
connection.setAutoCommit(false);
statement = connection.prepareStatement(sql_insert);
statement.setString(1, "test");
statement.executeUpdate();
currvalStatement = connection.createStatement();
currvalResultSet = currvalStatement.executeQuery(sql_currval);
if (currvalResultSet.next()) {
int id = currvalResultSet.getInt(1);
}
connection.commit();
// ...
Run Code Online (Sandbox Code Playgroud)
您可以使用Oracle的return子句.
insert into mytable(content) values ('test') returning your_id into :var;
Run Code Online (Sandbox Code Playgroud)
查看此链接以获取代码示例.您需要Oracle 10g或更高版本以及新版本的JDBC驱动程序.
| 归档时间: |
|
| 查看次数: |
10384 次 |
| 最近记录: |