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.