JDBC - procedura składowana
Nauczyliśmy się używać Stored Proceduresw JDBC podczas omawiania rozdziału JDBC - Oświadczenia . Ten rozdział jest podobny do tamtego, ale zawiera dodatkowe informacje na temat składni ucieczki JDBC SQL.
Podobnie jak obiekt Connection tworzy obiekty Statement i PreparedStatement, tworzy również obiekt CallableStatement, który zostałby użyty do wykonania wywołania procedury składowanej bazy danych.
Tworzenie obiektu CallableStatement
Załóżmy, że musisz wykonać następującą procedurę składowaną Oracle -
CREATE OR REPLACE PROCEDURE getEmpName
(EMP_ID IN NUMBER, EMP_FIRST OUT VARCHAR) AS
BEGIN
SELECT first INTO EMP_FIRST
FROM Employees
WHERE ID = EMP_ID;
END;
NOTE: Powyższa procedura składowana została napisana dla Oracle, ale pracujemy z bazą danych MySQL, więc napiszmy tę samą procedurę składowaną dla MySQL w następujący sposób, aby utworzyć ją w bazie danych EMP -
DELIMITER $$
DROP PROCEDURE IF EXISTS `EMP`.`getEmpName` $$
CREATE PROCEDURE `EMP`.`getEmpName`
(IN EMP_ID INT, OUT EMP_FIRST VARCHAR(255))
BEGIN
SELECT first INTO EMP_FIRST
FROM Employees
WHERE ID = EMP_ID;
END $$
DELIMITER ;
Istnieją trzy typy parametrów: IN, OUT i INOUT. Obiekt PreparedStatement używa tylko parametru IN. Obiekt CallableStatement może używać wszystkich trzech.
Oto definicje każdego -
Parametr | Opis |
---|---|
W | Parametr, którego wartość jest nieznana podczas tworzenia instrukcji SQL. Wartości parametrów IN można powiązać za pomocą metod setXXX (). |
NA ZEWNĄTRZ | Parametr, którego wartość jest dostarczana przez zwracaną instrukcję SQL. Możesz pobrać wartości z parametrów OUT za pomocą metod getXXX (). |
INOUT | Parametr, który zawiera zarówno wartości wejściowe, jak i wyjściowe. Łączysz zmienne metodami setXXX () i pobierasz wartości metodami getXXX (). |
Poniższy fragment kodu pokazuje, jak zastosować Connection.prepareCall() metoda tworzenia wystąpienia pliku CallableStatement obiekt oparty na poprzedniej procedurze składowanej -
CallableStatement cstmt = null;
try {
String SQL = "{call getEmpName (?, ?)}";
cstmt = conn.prepareCall (SQL);
. . .
}
catch (SQLException e) {
. . .
}
finally {
. . .
}
Zmienna typu String SQL reprezentuje procedurę składowaną z symbolami zastępczymi parametrów.
Używanie obiektów CallableStatement jest podobne do używania obiektów PreparedStatement. Przed wykonaniem instrukcji należy powiązać wartości ze wszystkimi parametrami, w przeciwnym razie zostanie wyświetlony wyjątek SQLException.
Jeśli masz parametry IN, po prostu postępuj zgodnie z tymi samymi regułami i technikami, które mają zastosowanie do obiektu PreparedStatement; użyj metody setXXX (), która odpowiada powiązanemu typowi danych Java.
Używając parametrów OUT i INOUT, należy zastosować dodatkową metodę CallableStatement, registerOutParameter (). Metoda registerOutParameter () wiąże typ danych JDBC z typem danych, które ma zwrócić procedura składowana.
Po wywołaniu procedury składowanej należy pobrać wartość z parametru OUT za pomocą odpowiedniej metody getXXX (). Ta metoda rzutuje pobraną wartość typu SQL na typ danych Java.
Zamykanie obiektu CallableStatement
Podobnie jak zamykasz inny obiekt instrukcji, z tego samego powodu powinieneś także zamknąć obiekt CallableStatement.
Proste wywołanie metody close () wykona zadanie. Jeśli najpierw zamkniesz obiekt Connection, spowoduje to również zamknięcie obiektu CallableStatement. Jednak zawsze należy jawnie zamknąć obiekt CallableStatement, aby zapewnić prawidłowe czyszczenie.
CallableStatement cstmt = null;
try {
String SQL = "{call getEmpName (?, ?)}";
cstmt = conn.prepareCall (SQL);
. . .
}
catch (SQLException e) {
. . .
}
finally {
cstmt.close();
}
study Przeanalizowaliśmy więcej szczegółów w kodzie wywoływanym - przykładowym .
Składnia JDBC SQL Escape
Składnia ucieczki zapewnia elastyczność korzystania z funkcji specyficznych dla bazy danych, niedostępnych przy użyciu standardowych metod i właściwości JDBC.
Ogólny format składni ucieczki SQL jest następujący -
{keyword 'parameters'}
Oto następujące sekwencje ucieczki, które byłyby bardzo przydatne podczas programowania JDBC:
d, t, ts Słowa kluczowe
Pomagają zidentyfikować literały daty, godziny i znacznika czasu. Jak wiesz, żadne dwa DBMS nie reprezentują czasu i daty w ten sam sposób. Ta składnia zmiany znaczenia informuje sterownik, aby renderował datę lub godzinę w formacie docelowej bazy danych. Na przykład -
{d 'yyyy-mm-dd'}
Gdzie rrrr = rok, mm = miesiąc; dd = data. Używam tej składni {d '2009-09-03'} 9 marca 2009.
Oto prosty przykład pokazujący, jak WSTAWIĆ datę w tabeli -
//Create a Statement object
stmt = conn.createStatement();
//Insert data ==> ID, First Name, Last Name, DOB
String sql="INSERT INTO STUDENTS VALUES" +
"(100,'Zara','Ali', {d '2001-12-16'})";
stmt.executeUpdate(sql);
Podobnie możesz użyć jednej z następujących dwóch składni t lub ts -
{t 'hh:mm:ss'}
Gdzie hh = godzina; mm = minuta; ss = sekunda. Używając tej składni {t '13: 30: 29 '} to 1:30:29.
{ts 'yyyy-mm-dd hh:mm:ss'}
Jest to składnia złożona z dwóch powyższych składni dla „d” i „t” w celu przedstawienia znacznika czasu.
Escape Keyword
To słowo kluczowe identyfikuje znak zmiany znaczenia używany w klauzulach LIKE. Przydatne w przypadku używania symbolu wieloznacznego SQL%, który odpowiada zeru lub większej liczbie znaków. Na przykład -
String sql = "SELECT symbol FROM MathSymbols
WHERE symbol LIKE '\%' {escape '\'}";
stmt.execute(sql);
Jeśli używasz znaku ukośnika odwrotnego (\) jako znaku zmiany znaczenia, musisz również użyć dwóch znaków ukośnika odwrotnego w literale Java String, ponieważ ukośnik odwrotny jest również znakiem zmiany znaczenia w Javie.
fn Słowo kluczowe
To słowo kluczowe reprezentuje funkcje skalarne używane w DBMS. Na przykład możesz użyć funkcji SQL length, aby uzyskać długość ciągu -
{fn length('Hello World')}
Zwraca 11, długość ciągu znaków „Hello World”.
call Keyword
To słowo kluczowe służy do wywoływania procedur składowanych. Na przykład w przypadku procedury składowanej wymagającej parametru IN użyj następującej składni -
{call my_procedure(?)};
W przypadku procedury składowanej wymagającej parametru IN i zwracającej parametr OUT użyj następującej składni -
{? = call my_procedure(?)};
oj Słowo kluczowe
To słowo kluczowe jest używane do oznaczania złączeń zewnętrznych. Składnia jest następująca -
{oj outer-join}
Gdzie external-join = table {LEFT | RIGHT | FULL} OUTERJOIN {table | zewnętrzne-sprzężenie} w warunku wyszukiwania. Na przykład -
String sql = "SELECT Employees
FROM {oj ThisTable RIGHT
OUTER JOIN ThatTable on id = '100'}";
stmt.execute(sql);