Apache Derby: funkcja ROUNDECIMAL (zaokrąglanie do podanej liczby miejsc)
Zadanie programistyczne
Stworzyć funkcję skalarną umożliwiającą zaokrąglenie liczby do podanej liczby miejsc po przecinku. Funkcja nie powinna dodawać zer jeśli podana liczba miejsc po przecinku jest większa od liczby miejsc po przecinku, które faktycznie ma argument.
Rozwiązanie
Napisać metodę roundToDecimal
. Metoda ta została umieszczona w klasie DerbyUtil
public static double roundToDecimal(double num, int dec) { int multi = (int)Math.pow(10, dec); int temp = (int)Math.round(num * multi); double temp1 = (double)temp / multi; return temp1; }
Zadeklarować funkcję w bazie Derby (r088.sql):
Napisać klasę testującą (R088_ROUNDECIMAL.java
):
package aderby.functions.custom; import aderby.DerbyUtil; import java.io.File; import java.sql.*; public class R088_ROUNDECIMAL { private static final String baza = "C:/Przyklady/r088_round"; private static final String skrypt = "aderby/src/resources/sqls/r088.sql"; private static final String sqlQuery = "SELECT czujnik, val, ROUNDECIMAL(val, 0) FROM temperatura"; 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.getDouble(2) + " " + rs.getDouble(3)); } } catch (SQLException e) { e.printStackTrace(); } DerbyUtil.close(rs); DerbyUtil.close(stat); DerbyUtil.close(con); DerbyUtil.shutdownDerbyEngine(); DerbyUtil.dropDatabase(new File(baza)); } }
Plik r088.sql
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 ROUNDECIMAL(DATA DOUBLE, DECIMALS INTEGER) RETURNS DOUBLE PARAMETER STYLE JAVA NO SQL LANGUAGE JAVA EXTERNAL NAME 'aderby.DerbyUtil.roundToDecimal' ; INSERT INTO temperatura (czujnik, val) VALUES (2, 37.8000502); 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);
Przetestować przykład
2 37.8000502 38.0 1 39.7 40.0 3 36.6 37.0 3 33.2 33.0 2 39.2 39.0 2 40.6 41.0 2 41.2 41.0 1 40.1 40.0 1 39.8 40.0 2 38.9 39.0 1 38.3 38.0 2 37.9 38.0 2 37.4 37.0 3 37.1 37.0 3 36.8 37.0 3 36.7 37.0 1 36.6 37.0
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.