powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / insert .... returning into в Oracle 9.2 через JDBC
3 сообщений из 3, страница 1 из 1
insert .... returning into в Oracle 9.2 через JDBC
    #32883384
zzz_fastcom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем доброе время суток!
Всем наверное, известно, что БД Oracle поддерживает синтаксис
insert into t (c1,c2)
values (...)
returning id into :bindvar
который позволяет вставив в таблицу запись сразу получить сгенеренные триггером или дефолтными значениями поля.
С другой стороны в JDBC есть понятие Auto-generated keys. Есть даже пример:

String sql = "INSERT INTO AUTHORS (LAST, FIRST, HOME) VALUES " +
"(?, ?, ?, keyColumn)";

PreparedStatement addAuthor = con.prepareStatement(sql,
Statement.RETURN_GENERATED_KEYS);
addAuthor.setString(1, "Wordsworth");
addAuthor.setString(2, "William");
addAuthor.setString(3, "England");

int rows = addAuthor.executeUpdate();

ResultSet rs = stmt.getGeneratedKeys();
if (rs.next()) {
ResultSetMetaData rsmd = rs.getMetaData();
int colCount = rsmd.getColumnCount();
do {
for (int i = 1; i <= colCount; i++) {
String key = rs.getString(i);
System.out.println("key " + i + "is " + key);
}
}
while (rs.next();)
}
else {
System.out.println("There are no generated keys.");
}

Причем сразу при выполнении con.prepareStatement у меня выпадает:
java.lang.AbstractMethodError: java.sql.PreparedStatement java.sql.Connection.prepareStatement(java.lang.String, int)

Oracle 9.2.0.4 на Windows XP
драйвер JDBC из JDeveloper 10g (9.0.5.1)

Не знает ли кто что за беда?
Спасибо
...
Рейтинг: 0 / 0
insert .... returning into в Oracle 9.2 через JDBC
    #32883803
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С Auto-generated keys не работал.
Можно так сделать:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE TABLE t(id INT, c1 INT, c2 INT);
CREATE SEQUENCE t_sq;

CREATE OR REPLACE TRIGGER t_trg
BEFORE INSERT ON t
FOR EACH ROW
BEGIN
	IF :new.id IS NULL THEN
		SELECT t_sq.NEXTVAl INTO :new.id FROM dual;
	END IF;
END;
/
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
 import  java.sql.*;

 class  testReturning {
	 public   static   void  main(String[] args)  throws  Exception {
		DriverManager.registerDriver( new  oracle.jdbc.driver.OracleDriver());
		Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:info", "tim", "t");

		CallableStatement cstmt = conn.prepareCall("BEGIN INSERT INTO t(c1, c2) VALUES(?, ?) RETURNING id INTO ?; END;");
		cstmt.setInt( 1 ,  1 );
		cstmt.setInt( 2 ,  2 );

		cstmt.registerOutParameter( 3 , Types.INTEGER);

		cstmt.executeQuery();

		System.out.println(cstmt.getInt( 3 ));
	}
};
...
Рейтинг: 0 / 0
insert .... returning into в Oracle 9.2 через JDBC
    #32884024
zzz_fastcom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Работает. Большое спасибо!
Про родной оракловый синтаксис я и забыл :-)
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / insert .... returning into в Oracle 9.2 через JDBC
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]