2010-12-16 16 views
12

Powiel możliwe:
PLSQL JDBC: How to get last row ID?Uzyskaj ostatni identyfikator na wstawionego wiersza w Oracle DB

mam problemu z dostaniem ID z tabelami. Mam dwie tabele AJPES_TR i TR_LOG, a PK z tabeli TR_LOG jest ustawiona jako klucz obcy w tabeli AJPES_TR.

W tabeli TR_LOG po prostu napiszę, które dane pliku zostały zaimportowane i chcę połączyć to PK z główną tabelą. W moim mySQL dobrze sobie radziłem z getID.last(); int j = getID.getInt(TR_LOG_ID);, ale teraz w Oracle to już nie działa.

Są to moi 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 (?,?)" 
); 

W mySQL identyfikatory zostały określone jako autoIncrement.

Jak mogę uzyskać wartość identyfikatora z TR_LOG i zapisać tę wartość w tabeli AJPES_TR?

+0

To pytanie nie jest duplikowane, ponieważ sterownik Oracle dla jdbc działa inaczej niż inne sterowniki –

Odpowiedz

6

W Oracle o wartości automatycznego przyrostu stosowanych sequences

Następny wartość SEQUENCE_NAME.NEXTVAL, ostatnio używany SEQUENCE_NAME.CURRVAL

+0

Dzięki za odpowiedź. Widziałem, że autoinkrecja jest już wykonywana, gdy administrator stworzył tabelę. Teraz potrzebuję tylko pomocy w uzyskaniu ID z tabeli TR_LOG.:) – Igor

2

Jesteś w stanie zasygnalizować kolumny automatycznego przyrostu w przygotowania zaproszenia oświadczenie

przykład:

PreparedStatement ps = con.prepareStatement(sql, pkColumns); 

Po wkładki rzędu bazy danych:

ResultSet keys = ps.getGeneratedKeys(); 

Ważne: Zadziała tylko, jeśli wartości automatycznego przyrostu został automatycznie ustawiony przez DB-trigger poprzez sekwencje

+4

Jesteś również zależny od używanego sterownika JDBC. Żaden ze sterowników JDBC dostarczonych przez Oracle nie obsługuje tego. – BalusC

4

Jeśli zrozumiałem prawidłowo chcesz wstawić rekord w jednej tabeli T1, dostać PK wstawionego rekordu i użycia jest jak FK w innej tabeli T2. W tym przypadku Oracle returning clause jest bardzo przydatne, można go używać tak (przepraszam nie wiem gorąco go używać w języku Java, ale należy się pomysł):

declare 
    fId int; 
begin 
    insert into T1(id) values seq1.nextval returning id into fId 
end; 

Po wkładki będziesz mieć utworzony identyfikator rekordu w zmiennej fId.

+0

Tak, właśnie to chcę zrobić. :) – Igor

12

Jeśli spust jest skonfigurowany tak, aby automatycznie ustawić pole klucza podstawowego z następnej wartości z sekwencji, a następnie można modyfikować INSERT następująco:

INSERT INTO table (field1, field2, field3) 
    VALUES (?, ?, ?) 
    RETURNING primary_key_field INTO ? 

Następnie dodać wartości parametrów dla INSERT , parametr wyjściowy na końcu dla klucza podstawowego i wykonaj zapytanie.

Po wykonaniu zapytania pobierz wartość parametru wyjściowego. Powinien zawierać wartość pola primary_key_field.

Powiązane problemy