Witam,
wybacz, ze dopiero teraz, ale ostatnio troche zabiegany jestem. SQL ma to do siebie, ze w zaleznosci od RDBMS, jego skladnia moze sie znaczaco roznic. Podany wczesniej przyklad dotyczy MySQL. Dla Derby wyglada to z lekka inaczej. Ponizej krotki HowTo, na podstawie ogolnych inf. z dokumentacji.
Stored procedures w Derby
Tworzenie wewnetrznych procedur odbywa sie w dwoch etapach:
1. tworzenie (definiowanie) ciala procedury jako zrodlo Java
Silnik Derby wymaga, aby definicja stored procedure znajdowala sie w publicznej klasie, w publicznej statycznej metodzie, ktora nie zwraca zadnego wyniku (void), oraz ew. moze wyrzucac wyjatek java.sql.SQLException. Przyklad:
package derbysample;
import java.sql.*;
public class MyProcedures {
public static void addAccount(String login, String password) throws SQLException {
Connection conn = DriverManager.getConnection("jdbc:default:connection");
PreparedStatement ps = conn.prepareStatement("INSERT INTO vir.users VALUES(?, ?)");
ps.setString(1, login);
ps.setString(2, password);
ps.executeUpdate();
ps.close();
conn.close();
}
public static void getAccounts(ResultSet[] data) throws SQLException {
Connection conn = DriverManager.getConnection("jdbc:default:connection");
Statement s = conn.createStatement();
data[0] = s.executeQuery("SELECT * FROM vir.users");
conn.close();
}
}
Klasa znajduje sie w pakiecie derbysample oraz operuje na bazie danych o nazwie VIR, bez uwierzytelniania. jdbc:default:connection oznacza, ze sterownik JNDI pobiera domyslne wartosci biezacej bazy dla danego polaczenia. W przypadku metody getAccounts(ResultSet[] data) zwracany jest wynik zapytania. Tutaj uwaga: ResultSet MUSI pozostac otwarty, aby CallableStatement, wywolujace metode, mialo do niego dostep. Tak przygotowany zestaw definicji procedur mozna skompilowac i zapakowac do pliku .jar, a nastepnie plik ten wrzucic w jakies widoczne miejsce (np. do katalogu %DERBY_INSTALL%/lib)
2. rejestrowanie procedury w bazie danych
Gdy metody dla procedur sa juz "wystawione", trzeba je zarejestrowac do bazy danych, w taki sposob:
call sqlj.install_jar('lib/derbysample.jar', 'APP.derbysample');
call syscs_util.syscs_set_database_property('derby.database.classpath', 'APP.derbysample');
create procedure vir.addAccount(in login varchar(40), in password varchar(40))
parameter style java
language java
external name 'derbysample.MyProcedures.accAccount';
create procedure vir.getAccounts()
parameter style java
language java
dynamic result sets 1
reads sql data
external name 'derbysample.MyProcedures.getAccounts';
W zaleznosci od narzedzi, komendy mozna wywolac albo z okna "Execute Command..." w NetBeans, albo (bardziej prawdopodobne) z dolaczonego do Derby narzedzia: ij. Pierwsze dwie komendy instaluja pakiet .jar z procedurami oraz ustawiaja go w classpath bazy danych.
Kolejne dwie sekcje to rejestrowanie procedur: pierwsza z dwoma parametrami, aktualizujaca baze danych (domyslny parametr: MODIFIES SQL DATA); druga bez parametrow, zwracajaca wynik zapytania (parametr: READS SQL DATA oraz DYNAMIC RESULT SETS 1). Tutaj trzeba zwrocic uwage, w jaki sposob przekazywany jest wynik zapytania w kodzie zrodlowym Java (metoda getAccounts(ResultSet[] data).
Tak przygotowane stored procedures mozna teraz wywolac komendami:
call vir.addAccount('jan', 'nowak');
call vir.getAccounts();
lub z poziomu kodu Java:
conn = DriverManager.getConnection("jdbc:derby://localhost:1527/vir");
CallableStatement cs = conn.prepareCall("{call vir.addAccount(?, ?)}");
cs.setString(1, "jan");
cs.setString(2, "nowak");
cs.executeUpdate;
CallableStatement cs = conn.prepareCall("{call vir.getAccounts()}");
ResultSet rs = conn.executeQuery();
Szczegoly tworzenia procedur: http://db.apache.org/derby/docs/10.1/ref/rrefcreateprocedurestatement.html
Troche wiecej o tworzeniu w Derby: http://www.vsj.co.uk/databases/display.asp?id=466