Zielony Smok - logo witryny

Apache Derby: funkcja użytkownika LG (logarytm o dowolnej podstawie)

Zadanie programistyczne

Stworzyć funkcję skalarną umożliwiającą dla podanej liczby obliczenie logarytmu o dowolnej podstawie.

Rozwiązanie

Napisać metodę lg. Metoda ta została umieszczona w klasie DerbyUtil.

public static double lg(double liczba, int podstawa) {
	return Math.log10(liczba) / (Math.log10(podstawa));
}

Zadeklarować funkcję w bazie Derby (skrypt r086.sql):

Napisać klasę testującą R086_LG.

Klasa R086_LG.java
package aderby.functions.custom;

import aderby.DerbyUtil;

import java.io.File;
import java.sql.*;

public class R086_LG {

        private static final String baza = "C:/Przyklady/r086_lg";
        private static final String skrypt = "aderby/src/resources/sqls/r086.sql";
    public static void main(String[] args) {
		DerbyUtil.startDerbyEngine(DerbyUtil.embdriver);
        Connection con = DerbyUtil.connectEmbeddedDB(baza,";create=true");
        DerbyUtil.jdbcRunScript(skrypt, con);
        Statement stat = null;
        ResultSet rs = null;
        try {
            stat = con.createStatement();
            rs = stat.executeQuery(
                    "SELECT czujnik, val, LG(val, 2) FROM temperatura");
            while (rs.next()) {
                System.out.println(rs.getInt(1) + " " + rs.getDouble(2) + " "
                        + rs.getDouble(3));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        DerbyUtil.close(rs);
        DerbyUtil.close(stat);
        DerbyUtil.close(con);
        DerbyUtil.shutdownEmbeddedDB(baza);
        DerbyUtil.shutdownDerbyEngine();
        DerbyUtil.dropDatabase(new File(baza));
    }
}
Plik r086.sq
CREATE TABLE temperatura(
            id INTEGER NOT NULL PRIMARY KEY GENERATED ALWAYS AS 
                    IDENTITY(START WITH 1, INCREMENT BY 1),
            czujnik INTEGER,
            val DOUBLE
);

CREATE INDEX i_czujnik ON temperatura (czujnik ASC);
CREATE INDEX i_val ON temperatura (val ASC);

CREATE FUNCTION LG(DATA DOUBLE, BASE INTEGER)
    RETURNS DOUBLE
    PARAMETER STYLE JAVA
    NO SQL
    LANGUAGE JAVA
    EXTERNAL NAME 'aderby.DerbyUtil.lg'
;    

INSERT INTO temperatura (czujnik, val) VALUES (2, 37.8);
INSERT INTO temperatura (czujnik, val) VALUES (1, 39.7);
INSERT INTO temperatura (czujnik, val) VALUES (3, 36.6);
INSERT INTO temperatura (czujnik, val) VALUES (3, 33.2);
INSERT INTO temperatura (czujnik, val) VALUES (2, 39.2);
INSERT INTO temperatura (czujnik, val) VALUES (2, 40.6);
INSERT INTO temperatura (czujnik, val) VALUES (2, 41.2);
INSERT INTO temperatura (czujnik, val) VALUES (1, 40.1);
INSERT INTO temperatura (czujnik, val) VALUES (1, 39.8);
INSERT INTO temperatura (czujnik, val) VALUES (2, 38.9);
INSERT INTO temperatura (czujnik, val) VALUES (1, 38.3);
INSERT INTO temperatura (czujnik, val) VALUES (2, 37.9);
INSERT INTO temperatura (czujnik, val) VALUES (2, 37.4);
INSERT INTO temperatura (czujnik, val) VALUES (3, 37.1);
INSERT INTO temperatura (czujnik, val) VALUES (3, 36.8);
INSERT INTO temperatura (czujnik, val) VALUES (3, 36.7);
INSERT INTO temperatura (czujnik, val) VALUES (1, 36.6);

Wynik

Przetestować przykład:

2 37.8 5.24031432933371
1 39.7 5.3110671022555955
3 36.6 5.19377174339668
3 33.2 5.053111336459562
2 39.2 5.292781749227847
2 40.6 5.343407822297814
2 41.2 5.364572432295856
1 40.1 5.325530331567558
1 39.8 5.314696525656286
2 38.9 5.281698250098829
1 38.3 5.259272487037594
2 37.9 5.24412594328373
2 37.4 5.224966365000274
3 37.1 5.213347281733441
3 36.8 5.20163386116965
3 36.7 5.197708157955851
1 36.6 5.19377174339668

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.