Apache Derby: operator użytkownika XOR
Funkcja XOR (alternatywa rozłączna albo… albo…)
Zadanie programistyczne
Lekarz potrzebuje funkcji pozwalającej na śledzenie zmian stanu pacjentów.
Rozwiązanie
Musimy napisać metodę xor, zwracającą true wtedy i tylko wtedy, gdy argumenty są różne. Metoda ta została umieszczona w klasie DerbyUtil
public static boolean xor(boolean p, boolean q) { return (p || q) && !(p && q); }
Musimy zadeklarować funkcję w bazie Derby (skrypt r090.sql)
Napisać klasę testującą (R090_XOR
).
Klasa R090_XOR.java
package aderby.functions.custom; import aderby.DerbyUtil; import java.io.File; import java.sql.*; public class R090_XOR { private static final String baza = "C:/Przyklady/r090_xor"; private static final String skrypt = "aderby/src/resources/sqls/r090.sql"; private static final String sqlQuery = "SELECT id, XOR(val1, val2) FROM valid"; public static void main(String[] args) { DerbyUtil.startDerbyEngine("EmbeddedDriver"); Connection con = DerbyUtil.connectEmbeddedDB(baza, ";create=true"); DerbyUtil.jdbcRunScript(skrypt, con); Statement stat = null; ResultSet rs = null; try { stat = con.createStatement(); rs = stat.executeQuery(sqlQuery); while (rs.next()) { System.out.println(rs.getInt(1) + " " + rs.getBoolean(2)); } } catch (SQLException e) { e.printStackTrace(); } DerbyUtil.close(rs); DerbyUtil.close(stat); DerbyUtil.close(con); DerbyUtil.shutdownDerbyEngine(); DerbyUtil.dropDatabase(new File(baza)); } }
Skrypt r090.sql
CREATE TABLE valid( id INTEGER NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY(START WITH 1, INCREMENT BY 1), val1 BOOLEAN, val2 BOOLEAN ); CREATE FUNCTION XOR(p BOOLEAN, q BOOLEAN) RETURNS BOOLEAN PARAMETER STYLE JAVA NO SQL LANGUAGE JAVA EXTERNAL NAME 'aderby.DerbyUtil.xor' ; INSERT INTO valid (val1, val2) VALUES (true, false); INSERT INTO valid (val1, val2) VALUES (false, false); INSERT INTO valid (val1, val2) VALUES (false, true); INSERT INTO valid (val1, val2) VALUES (true, false); INSERT INTO valid (val1, val2) VALUES (false, false); INSERT INTO valid (val1, val2) VALUES (false, true); INSERT INTO valid (val1, val2) VALUES (true, true); INSERT INTO valid (val1, val2) VALUES (true, true); INSERT INTO valid (val1, val2) VALUES (true, false); INSERT INTO valid (val1, val2) VALUES (false, true); INSERT INTO valid (val1, val2) VALUES (false, false); INSERT INTO valid (val1, val2) VALUES (false, false); INSERT INTO valid (val1, val2) VALUES (true, false); INSERT INTO valid (val1, val2) VALUES (false, true); INSERT INTO valid (val1, val2) VALUES (true, false); INSERT INTO valid (val1, val2) VALUES (true, true); INSERT INTO valid (val1, val2) VALUES (true, true);
Przetestować przykład.
1 true 2 false 3 true 4 true 5 false 6 true 7 false 8 false 9 true 10 true 11 false 12 false 13 true 14 true 15 true 16 false 17 false
Pliki do ściągnięcia
Aktualny (tworzony narastająco) plik module-info.java
Aktualny (tworzony narastająco) plik DerbyUtil.java
Pliki tworzone narastająco zastępują poprzednie pliki o tej samej nazwie i działają dla wszystkich wcześniej opublikowanych przykładów we wszystkich wpisach w projekcie. W przypadku pliku module-info.java
może być potrzebne skreślenie niepotrzebnych wpisów.