Zielony Smok - logo witryny

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.