Łączenie z bazą danych przykładowa klasa infpolaczenie import java.sql.drivermanager; import java.sql.connection; import java.sql.sqlexception; public class infpolaczenie { public static void main(string[] argv) { System.out.println("Sprawdzanie czy zostal zarejestrowany sterownik "); Class.forName("org.postgresql.Driver"); catch (ClassNotFoundException cnfe) { System.out.println("Nie moge znalezc sterownika!"); System.out.println("Wyswietlam sciezke i wychodze z programu."); cnfe.printstacktrace(); System.exit(1); Łączenie z bazą danych przykładowa klasa infpolaczenie (c.d.) System.out.println("Zarejestrowano sterownik, lacze sie..."); Connection c = null; c = DriverManager.getConnection("jdbc:postgresql://localhost/archiwum","olga", "olga"); catch (SQLException se) { System.out.println("Blad! Nie moge sie polaczyc"); se.printstacktrace(); System.exit(1); if (c!= null) System.out.println("Ustanowiono polaczenie z baza"); else System.out.println("Polacznie z baza nie powiodlo sie"); Metadane w JDBC - przykład Wykorzystanie metod interfejsu DatabaseMetaData do wypisania informacji o bazie danych: Metadane w JDBC przykład (c.d.) System.out.print("Nazwa RDBMS: "); System.out.println(dmd.getDatabaseProductName()); System.out.print("Wersja PostgreSQL: "); System.out.println(dmd.getDatabaseProductVersion()); System.out.print("Nazwa użytkownika: "); System.out.println(dmd.getUserName()); System.out.print("Główny numer poprawki sterownika: "); System.out.println(dmd.getDriverMajorVersion()); System.out.print("Poboczny numer poprawki sterownika: "); System.out.println(dmd.getDriverMinorVersion()); System.out.print("Nazwa sterownika: "); System.out.println(dmd.getDriverName()); 1
System.out.print("Wersja sterownika: "); System.out.println(dmd.getDriverVersion()); Metadane w JDBC przykład (c.d.) System.out.print("Adres URL sterownika JDBC: "); System.out.println(dmd.getURL()); System.out.print("Używanie plików lokalnych do zapisywania tabel: "); System.out.println(dmd.usesLocalFiles()); con.close(); Zapytania do bazy Connection con = null; Statement stm = null; ResultSet rs = null; Class.forName ("org.postgresql.driver"); con = DriverManager.getConnection("jdbc:postgresql://localhost/archiwum", "olga", "olga"); stm = con.createstatement(); //utworzenie obiektu typu Statement //wykonanie zapytania rs = stm.executequery("select imie, nazwisko, data_urodzenia,"+ "miejsce_urodzenia, adres FROM osoby"); //przetworzenie otrzymanych danych //wypisanie danych za pomocą funkcji println System.out.println(rs.getString("Nazwisko") +", " + rs.getlnt("wiek") ); Zapytania do bazy catch(sqlexception e){ //obsługa wyjątku finally{ //zamknięcie połączenia z bazą danych try{ if(null!=con.close(); con = null; catch(exception ee){ ee.printstacktrace(); Zapytania do bazy - przykład import java.sql.*; import java.util.*; public class TabelaOsoby{ final static String jdbcdriver = "org.postgresql.driver"; final static String table = "osoby"; public static void main(string[] args) { System.out.println("--- Zawartość tabeli osoby---"); 2
Class.forName(jdbcDriver); Kody do wykładu Programowanie baz danych JDBC Maria Dems; Zapytania do bazy - przykład (c.d.) Connection con = DriverManager.getConnection("jdbc:postgresql://localhost/archiwum", "olga", "olga"); Statement stm = con.createstatement(); ResultSet rs = stm.executequery("select * FROM "+ table); ResultSetMetaData rsmd = rs.getmetadata(); int columncount = rsmd.getcolumncount(); for(int kol = 1; kol <= columncount; kol++) { System.out.print(rsmd.getColumnLabel(kol)); System.out.print(" (" + rsmd.getcolumntypename(kol)+")"); if(kol < columncount) System.out.print(", "); Zapytania do bazy - przykład (c.d.) System.out.println(); while(rs.next()) { for(int col = 1; col <= columncount; col++) { System.out.print(rs.getString(col)); if(col < columncount) System.out.print(", "); System.out.println(); rs.close(); stm.close(); con.close(); catch (ClassNotFoundException e) { System.out.println("Nie można załadować sterownika"); catch (SQLException e) { System.out.println("Wyjątek SQL : " + e.getmessage()); Zapytania do bazy Connection con = null; Statement stm = null; ResultSet rs = null; Class.forName ("org.postgresql.driver"); con = DriverManager.getConnection("jdbc:postgresql://localhost/archiwum", "olga", "olga"); stm = con.createstatement(); //utworzenie obiektu typu Statement //wykonanie zapytania rs = stm.executequery("select imie, nazwisko, data_urodzenia,"+ "miejsce_urodzenia, adres 3
FROM osoby"); //przetworzenie otrzymanych danych //wypisanie danych za pomocą funkcji println System.out.println(rs.getString("Nazwisko") +", " + rs.getlnt("wiek") ); Przewijanie zbioru wyników w JDBC Możliwe do ustawienia wartości parametrów int resultsettype, oraz int resultsetconcurrency Aby uzyskać zestaw wyników zapytania z przewijaniem w obie strony, należy zadeklarować instrukcję: // utworzenie obiektu ResultSet z przewijaniem typu insensitive Statement stm = connection.createstatement ( // zestaw wyników z przewijaniem ResultSet.TYPE_SCROLL_INSENSITIVE, // zestaw wyników tylko do odczytu. ResultSet.CONCUR_READ_ONLY); // utworzenie obiektu ResultSet z przewijaniem typu sensitive stm = connection.createstatement ( ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY); catch (SQLException e) { Zapytania do bazy Connection con = null; Statement stm = null; ResultSet rs = null; Class.forName ("org.postgresql.driver"); con = DriverManager.getConnection("jdbc:postgresql://localhost/archiwum", "olga", "olga"); stm = con.createstatement(); //utworzenie obiektu typu Statement //wykonanie zapytania rs = stm.executequery("select imie, nazwisko, data_urodzenia,"+ "miejsce_urodzenia, adres FROM osoby"); //przetworzenie otrzymanych danych //wypisanie danych za pomocą funkcji println System.out.println(rs.getString("Nazwisko") +", " + rs.getlnt("wiek") ); Aby uzyskać zestaw wyników zapytania z przewijaniem w obie strony, należy zadeklarować instrukcję: 4
// utworzenie obiektu ResultSet z przewijaniem typu insensitive Statement stm = connection.createstatement ( // zestaw wyników z przewijaniem ResultSet.TYPE_SCROLL_INSENSITIVE, // zestaw wyników tylko do odczytu. ResultSet.CONCUR_READ_ONLY); // utworzenie obiektu ResultSet z przewijaniem typu sensitive stm = connection.createstatement ( ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY); catch (SQLException e) { Aktualizowanie zbioru wyników w JDBC Przykładowo, w celu zmiany danych w bazie można napisać kod: String query = "SELECT * FROM osoby"; ResultSet rs = stm.executequery(query); if( ){ String nr = String adres = rs.getstring("adres") + nr;.. rs.updatestring ("adres", adres) ; rs.updaterow(); Zapytania do bazy Connection con = null; Statement stm = null; ResultSet rs = null; Class.forName ("org.postgresql.driver"); con = DriverManager.getConnection("jdbc:postgresql://localhost/archiwum", "olga", "olga"); stm = con.createstatement(); //utworzenie obiektu typu Statement //wykonanie zapytania rs = stm.executequery("select imie, nazwisko, data_urodzenia,"+ "miejsce_urodzenia, adres FROM osoby"); //przetworzenie otrzymanych danych //wypisanie danych za pomocą funkcji println System.out.println(rs.getString("Nazwisko") +", " + rs.getlnt("wiek") ); Aby uzyskać zestaw wyników zapytania z przewijaniem w obie strony, należy zadeklarować instrukcję: // utworzenie obiektu ResultSet z przewijaniem typu insensitive 5
Statement stm = connection.createstatement ( // zestaw wyników z przewijaniem ResultSet.TYPE_SCROLL_INSENSITIVE, // zestaw wyników tylko do odczytu. ResultSet.CONCUR_READ_ONLY); // utworzenie obiektu ResultSet z przewijaniem typu sensitive stm = connection.createstatement ( ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY); catch (SQLException e) { Aktualizowanie zbioru wyników w JDBC Przykładowo, w celu zmiany danych w bazie można napisać kod: String query = "SELECT * FROM osoby"; ResultSet rs = stm.executequery(query); if( ){ String nr = String adres = rs.getstring("adres") + nr;.. rs.updatestring ("adres", adres) ; rs.updaterow(); Operacje na zbiorze wyników w JDBC Pokazuje to przykład: Zapytania do bazy Connection con = null; Statement stm = null; ResultSet rs = null; Class.forName ("org.postgresql.driver"); con = DriverManager.getConnection("jdbc:postgresql://localhost/archiwum", "olga", "olga"); stm = con.createstatement(); //utworzenie obiektu typu Statement //wykonanie zapytania rs = stm.executequery("select imie, nazwisko, data_urodzenia,"+ "miejsce_urodzenia, adres FROM osoby"); //przetworzenie otrzymanych danych //wypisanie danych za pomocą funkcji println System.out.println(rs.getString("Nazwisko") +", " + rs.getlnt("wiek") ); Aby uzyskać zestaw wyników zapytania z przewijaniem w obie strony, należy zadeklarować instrukcję: 6
// utworzenie obiektu ResultSet z przewijaniem typu insensitive Statement stm = connection.createstatement ( // zestaw wyników z przewijaniem ResultSet.TYPE_SCROLL_INSENSITIVE, // zestaw wyników tylko do odczytu. ResultSet.CONCUR_READ_ONLY); // utworzenie obiektu ResultSet z przewijaniem typu sensitive stm = connection.createstatement ( ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY); catch (SQLException e) { Aktualizowanie zbioru wyników w JDBC Przykładowo, w celu zmiany danych w bazie można napisać kod: String query = "SELECT * FROM osoby"; ResultSet rs = stm.executequery(query); if( ){ String nr = String adres = rs.getstring("adres") + nr;.. rs.updatestring ("adres", adres) ; rs.updaterow(); Operacje na zbiorze wyników w JDBC Zasady użycia metod: executeouery(), executeupdate() i execute(), umożliwiających wykonanie poleceń SQL na rzecz obiektu Statement: Ten sam obiekt Statement może zostać wielokrotnie wykorzystany do wykonania różnych instrukcji SQL. Przykładowy kod, wstawiający do tabeli dwa rekordy za pomocą dwóch obiektów ResultSet ma postać: import java.sql.*; import java.io.*; public class DodawanieRekordow { public static DodawanieRekordow dodawanierekordow; protected Connection connection = null; public DodawanieRekordow(){ try{ connect(); writerecord(); close(); 7
catch(sqlexception e){ System.out.println("Błąd: " + e); while((e = e.getnextexception())!= null){ public static void main(string args[]){ dodawanierekordow = new DodawanieRekordow(); public void connect()throws SQLException{ try{ Class.forName("org.postgresql.Driver"); catch(classnotfoundexception e){ System.out.println("Błąd załadownaia sterownika: " + e); System.exit(-1); connection = DriverManager.getConnection("jdbc:postgresql://localhost/archiwum", "olga", "olga"); System.out.println("\nPołączenie zostało nawiązane\n"); public void close()throws SQLException{ connection.close(); System.out.println("\nPołączenie zostało zamknięte\n"); public void writerecord()throws SQLException{ Statement statement = connection.createstatement(); int liczba = statement.executeupdate("insert INTO osoby VALUES (1,'Olga', Kowalska', '01/01/1980', 'Warszawa', Nowa 27/11')"); System.out.println("Liczba dodanych rekordów: " + liczba); Operacje na zbiorze wyników w JDBC //połączenie jest nawiązane i utworzony obiekt Statement statement String sql; //do typu String przypisano zmienną reprezentującą polecenia SQL //... //wykonanie metody execute() boolean b = statement.execute(sql); if(b){ //sprawdzamy zwróconą wartość b == true //obsługa danych ResultSet rs = statement.getresultset(); 8
//... System.out.println(rs.getlnt("nazwa_pola")); // inna obsługa danych //... else{ // zwrócona wartość b == false //sprawdzenie ilości zmienionych rekordów int liczba = statement.getupdatecount(); System.out.println("Liczba zmienionych rekordów: "+ liczba); //zamknięcie połączenia ResultSet rs = stm.executequery(" "); //. ResultSetMetaData rsmd = rs.getmetadata(); Connection con DriverManager.getConnection("jdbc:postgresql://localhost/ archiwum","olga", "olga"); void wypisz(string args){ System.out.println(args); String query = "SELECT imie, nazwisko, adres FROM osoby"; try{ Statement stm = con.createstatement(); ResultSet rs = stm.executequery(query); ResultSetMetaData rsmd = rs.getmetadata(); int liczba = rsmd.getcolumncount(); //liczba kolumn for(int i = 1; i<=liczba; i++) { wypisz('\n' rsmd.getcolumnname(i)); //nazwa wypisz(' ' rsmd.getcolumndisplaysize(i)); //szerokość wypisz(' ' rsmd.getcolumnclassname(i)); //klasa Javy wypisz(' ' rsmd.getcolumntype(i)); //typ SQL wypisz(' ' rsmd.getcolumntypename(i)); //typ RDBMS stm.close(); con.close(); catch(sqlexception e){ System.out.println(e.getMessage()); 9
//połączenie zostało już nawiązane przez obiekt Connection con try{ con.setautocommit(false); //wyłączenie trybu autocommit Statement stm = con.createstatement(); //utworzenie ob. Statement //wywołanie polecenia SQL stm.executeupdate("update osoby"+ SET adres = Nowa 27 + "WHERE Nazwisko LIKE '%ska';"); stm.executeupdate("delete FROM osoby"+ "WHERE adres = Nowa 27'"); con.commit(); //zatwierdzenie transakcji w przypadku braku błędów catch(exception e){ con.rollback(); //odwołanie transakcji przy wystąpieniu błędów //zamknięcie połączenia Connection con = DriverManager.getConnection ("jdbc:postgresql://localhost/archiwum","olga", "olga"); Statement stm = con.createstatement(); Savepoint sp; stm.executeupdate(("insert INTO osoby VALUES (1,'Olga', Kowalska', '01/01/1980', 'Warszawa', Nowa 27/11')"); sp = con.setsavepoint(safety); stm.executeupdate("insert INTO akta_studenckie (id_osoby, nr_albumu) VALUES (2, 22780)"); try{ stm.executeupdate("update osoby SET akta_studenckie = 2 WHERE id = 1"); catch(sqlexception e){ con.rollback(sp); con.commit(); Transakcje w JDBC - przykładowy program import java.sql.* ; public class Transakcja1 { public static void main(string [ ] args) throws SQLException { int kod_bledu ; Connection conn = null ; //Załadowanie i rejestracja sterownika Oracle DriverManager.registerDriver (new oracle.jdbc.driver.oracledriver( )); //ustanawiamy połączenie conn = DriverManager.getConnection ( jdbc:oracle:thin:@training: 1521:Oracle, oratest, oratest ) ; Transakcje w JDBC - przykładowy program //Wyłączamy tryb automatycznego zatwierdzania conn = setautocommit( false) ; 10
String sql1 = SELECT nr FROM tabela WHERE nr=? ; String sql2 = INSERT INTO tabela VALUES (?.?.?) ; PreparedStatement pstmt1 = conn. preparestatement (sql1) ; PreparedStatement pstmt2 = conn. preparestatement (sql2) ; pstmt1.setint(1, 9999); ResultSet rset = pstmt1.executequery( ) ; if (rset.next( ) ) { System.out.println( nr 9999 istnieje ) ; rset.close ( ) ; else { pstmt2.setint(1, 9999); pstmt2.setstring(2, Adam ) ; pstmt2.setstring(3, Kowalski ) ; Transakcje w JDBC - przykładowy program pstmt1.close ( ) ; pstmt2.close( ) ; //zatwierdzamy efekt instrukcji INSERT conn.commit( ) ; conn.close( ) catch (SQLException e) //wycofujemy zmiany, aby anulować efekt instrukcji INSERT { conn. Rollback ( ) ; kod_bledu = e.geterrorcode( ) ; System.err.println(kod_bledu + e.getmessage( ) ) ; Connection con = null; try{ //wywołanie funkcji powodujących wyjątek: // połączenie z bazą danych, polecenia SQL catch(sqlexception e){ //przechwycenie wyjątku i wyświetlenie go na konsoli System.out.println(e.getMessage()); //pobranie referencji do kolejnych wyjątków, //do momentu otrzymania wartości null while(null!=(e=e.getnextexception()){ //wyświetlenie informacji o kolejnych wyjątkach System.out.println(e.getMessage()); Connection con = null; try{ 11
//połączenie i wykonanie transakcji catch(sqlexception e) { //obsługa wyjątku final { if(con!= null){ con.close(); catch(sqlexception e){ Mapowanie typów danych w JDBC Przykład wywołania funkcji wyzej z konwertowaniem dostarczonych argumentów znakowych na wielkie litery //utworzono i zainicjowano obiekt Connection con //utworzenie obiektu CallableStatement, z podaniem w argumencie // funkcji 'preparecall' składni wywołania funkcji przechowywanej CallableStatement wyzej = con.preparecall("{?=call wyzej(?)"); //rejestracja par. wyjściowego funkcji którym jest znacznik "?" wyzej.registeroutparameter(1, Types.VARCHAR); //przypisanie pierwszemu znacznikowi '?' wartości wyzej.setstring(2, "Konwertuj z małych liter na duże"); //wywołanie wykonania funkcji przechowywanej wyzej.execute(); String wyzejpobierz = wyzej.getstring(1); wyzej.close(); Przykład zwracania wartości funkcji jako refcursor //ustawiono wywołanie funkcji. Statement stm = con.createstatement(); stm.execute("create OR REPLACE FUNCTION refkursorfunkcja()" +"RETURNS refcursor AS DECLARE kursor refcursor ; " + " BEGIN OPEN kursor FOR SELECT 1 UNION SELECT 2; " + " RETURN kursor ; END ;' language plpgsql"); stm.close(); //należy być wewnątrz transakcji dla kursorów, by pracować z nimi con.setautocommit(false); //wywołanie procedury CallableStatement proc = con.preparecall("{?=call refkursorfunkcja()"); proc.registeroutparameter(1, Types.Other); proc.execute(); ResultSet rs = (ResultSet)proc.getObject(1); while (rs.next()) { //działania na rezultatach rs.close(); 12
proc.close(); Kody do wykładu Programowanie baz danych JDBC Maria Dems; Przykład zwracania wartości funkcji jako typ danych SETOF Statement stm = con.createstatement(); stm.execute("create OR REPLACE FUNCTION setoffunkcja()" +"RETURNS SETOF int AS 'SELECT 1 UNION SELECT 2; ' language sql"); ResultSet rs = stm.executequery("select * FROM setoffunkcja()"); while (rs.next()) { // jakies operacje na danych rs.close(); stm.close(); Funkcje przechowywane w JDBC Wartości zwracane przez refcursor można potraktować jako nazwę kursora; w tym celu należy użyć metody getstring() obiektu ResultSet. W kursorze można również używać takich poleceń jak FETCH i MOVE. Obsługa dużych obiektów w JDBC JDBC umożliwia obsługę stosunkowo dużych obiektów za pomocą metod getbytes() i getstring(), należących do interfejsu java.sql.resultset. Często jednak znajdujące się w bazie obiekty mogą być tak duże, że zastosowanie powyższych metod nie będzie możliwe. JDBC udostępnia metody operujące na strumieniach: getbinarystream(), getasciistream(), getunicodestream() setbinarystream(), setasciistream() setunicodestream(). W celu zapisania w bazie danych znajdującego się na dysku twardym zdjęcia należy napisać kod: //utworzono połączenie, stworzono i zainicjowano obiekt // Connection con i utworzono obiekt File dla pliku zdjecia File zdjecie = new File("olga.gif"); int wielkoscpliku = zdjecie.length(); //odczytanie wielkości pliku //utworzenie strumienia wejściowego z pliku InputStream is = new FileInputStream(zdjecie); //przygotowanie poleceń wstawiania do bazy PreparedStatement pstm = 13
con.preparestatement("update PORTRETY SET zdjecie =?" + "WHERE nazwisko = Kowalska'"); //przypisanie strumienia wejściowego z pliku //do strumienia danych, przesyłanych do bazy pstm.setbinarystream(1, is, wielkoscpliku); pstm.execute(); //wywołanie wykonania polecenia W celu uzyskania pliku z bazy danych należy napisać kod: //utworzono połączenie, stworzono i zainicjowano obiekt // Connection con i utworzono obiekt Statement w postaci: Statement stm = con.createstatement(resultset.type_scroll_insensitive, ResultSet.CONCUR_READ_ONLY); String query = "SELECT zdjecia FROM osoby" + //utworzenie polecenia SQL "WHERE Nazwisko = Kowalska'"; //wykonanie zapytania- otrzymanie referencji do obiektu ResultSet ResultSet rs = stm.executequery(query); byte() bufor = new byte[2048]; //utworzenie buforu dla danych wypisanych z bazy //ustawienie kursora obiektu ResultSet przed pierwszym rekordem rs.beforefirst(); //przypisanie do zmiennej is strumienia wejściowego z bazy InputStream is = rs.getbinarystream("zdjecie"); int rozmiar = 0; //odczytanie danych ze strumienia while((rozmiar = in.read(bufor)) > 0){ //... //operacja na danych pobranych z bazy Sposób obsługi struktur w JDBC ilustruje przykład: import java.sql.*; public Class DodatkoweInformacje implements SQLData { //deklarowanie zmiennej określającej nazwę struktury private String sql_type; //deklarowanie zmiennych, odpowiadających polom struktury public int wzrost; public String dodatkowe_dane; //konstruktor bez paramertów, inicjujący obiekt przez JDBC public DodatkoweInformacje(){ //drugi konstruktor, niezbędny do utworzenia i zapisu obiektu do bazy public DodatkoweInformacje(String sql_type, int wzrost, String dodatkowe_dane) { this.sql_type = sql_type; this.wzrost = wzrost; this.dodatkowe_dane = dodatkowe_dane; 14
//implementowanie funkcji z interfejsu SQLData zwracającej sql_type public String getsqltypename() throws SQLException{ return sql_type; public void readsql(sqlinput stream, String typename) throws SQLException{ //podstawienie do zmiennej sql_type wartości przekazanej //w argumencie typename sql_type = typename; //odczytanie ze strumienia wartości pól struktury //w kolejności określonej w definicji struktury w bazie danych wzrost = stream.readlnt(); dodatkowe_dane = stream.readstring(); public void writesql(sqloutput stream) throws SQLException{ //zapisanie do strumienia wartości zmiennych obiektu //w kolejności określonej w definicji struktury w bazie danych stream.writeint(wzrost); stream.writestring(dodatkowe_dane); //nawiązano połączenie z bazą danych oraz stworzono // i zainicjowano obiekt Connection con //pobranie referencji do obiektu Map zawierającego zmapowane typy //SQL do klas Javy java.util.map map = con.gettypemap(); //mapowanie struktury do zaimplementowanej klasy map.put("informacje", Class.forName("DodatkoweInformacje")); //utworzenie obiektu Statement Statement stm = con.createstatement(resultset.type_scroll_insensitive, RsultSet.CONCUR_READ_ONLY) //wykonanie zapytania ResultSet rs = stm.executequery("select informacje FROM osoby +"WHERE nazwisko = Kowalska'"); //w tabeli jest jeden taki rekord, więc rezultat zapytania został //zapisany dla pierwszego wyniku rs.first(); //pobranie obieku DodatkoweInformacje inf = (DodatkoweInformacje)rs.getObject("informacje"); //przetwarzanie zwróconych danych System.out.println("Waga: "+inf.waga); System.out.println("dodatkowe_dane: "+inf. dodatkowe_dane); Struktury w JDBC Sposób dodania nowych wartości do bazy danych do tabeli osoby z wykorzystaniem uprzednio zdefiniowanego obiektu DodatkoweInformacje ilustruje kod: 15
//utworzenie obiektu PreparedStatement i przypisanie do niego //polecenia SQL modyfikującego dane w kolumnie informacje, jeśli //zostanie spełniony warunek WHERE PreparedStatement pstm = con.preparestatement("update osoby " + "SET informacje =?"+ "WHERE nazwisko = Kowalska'"); //utworzenie obiektu klasy DodatkoweInformacje DodatkoweInformacje inf = new DodatkoweInformacje(196, "Polka, dwie specjalizacje: informatyka, elektrotechnika"); //przypisanie zmiennej inf do znacznika? pstm.setobject(1, daneos, Types.STRUCT); //wykonanie polecenia UPDATE pstm.execute(); //... Wywoływanie procedur przechowywanych Javy w JDBC - przykładowy program import java.sql.* ; public class JavaProcPrzyklad { public static void main(string [ ] args) throws SQLException { int kod_bledu ; Connection conn = null ; //Załadowanie i rejestracja sterownika Oracle DriverManager.registerDriver (new oracle.jdbc.driver.oracledriver( )); //ustanawiamy połaczenie conn = DriverManager.getConnection ( jdbc:oracle:thin:@training: 1521:Oracle, oratest, oratest ) ; //Procedura usuwa rekordy z tabeli, w których nr = 20 int i_nr = 20 ; CallableStatement pstmt = conn.preparecall( {call proc_nazwa (?) ) ; pstmt.setint (1, i_nr) ; pstmt.executeupdate ( ) ; pstmt.close ( ) ; conn.close( ) catch (SQLException e) { kod_bledu = e.geterrorcode( ) ; System.err.println(kod_bledu + e.getmessage( ) ) ; conn.close( ) ; 16