使用Java或Groovy为SQLite编写用户定义的SQL函数? [英] Writing user defined SQL functions for SQLite using Java or Groovy?

查看:126
本文介绍了使用Java或Groovy为SQLite编写用户定义的SQL函数?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用SQLite,用户定义的SQL函数可以很容易地使用 C api 或< a href =http://etutorials.org/Server+Administration/upgrading+php+5/Chapter+4.+SQLite/4.6+User-Defined+Functions/ =nofollow noreferrer> PHP 。但是,使用Java还是Groovy也是可以的?解析方案

原来写一个用户定义的函数实际上很容易使用 SQLiteJDBC 。这里有一个Groovy的例子:

pre $ code $ @GrabConfig(systemClassLoader = true)
@Grab('org.xerial:sqlite- jdbc:3.6.16')
import org.sqlite。*
import java.sql。*

db = groovy.sql.Sql.newInstance(jdbc:sqlite: :memory:,org.sqlite.JDBC)

//使用球形余弦定律的距离函数
Function.create(db.getConnection(),distance, new function(){
protected void xFunc()throws SQLException {
def lat1 = value_double(0)
def lon1 = value_double(1)
def lat2 = value_double(2)
def lon2 = value_double(3)

double theta = lon1 - lon2;
double dist =(Math.sin(deg2rad(lat1))* Math.sin(deg2rad(数学公式(deg2rad(lat1))* Math.cos(deg2rad(lat2))* Math.cos(deg2radθ))
dist = Math.acos dist)
dist = rad2deg(dist)
dist = dist * 60 * 1.1515
dist = dist * 1.609344
结果(DIST);
}

def deg2rad(deg){
deg * Math.PI / 180.0
}

def rad2deg(rad){
rad * 180.0 / Math.PI
}
})

db.execute(CREATE TABLE city(name,lat,lon))
db.execute(INSERT INTO city(name,lat,lon)VALUES('New York City',40.7143,-74.0060))
db.execute(INSERT INTO city(name,lat,lon)VALUES ('San Francisco',37.7749,-122.4194))
db.execute(INSERT INTO city(name,lat,lon)VALUES('Paris',48.8567,2.3510))
db。执行(INSERT INTO city(name,lat,lon)VALUES('Cologne',50.9407,6.9599))

db.eachRow(SELECT a.name as a,b.name as b ,距离(a.lat,a.lon,b.lat,b.lon)作为d从城市a,城市b WHERE a.name!= b.name ORDER BY d;){
println距离从$ {it.a}到$ {it.b}:$ {it.d} km


With SQLite, user defined SQL functions can easily be added using the C api or PHP. But is it also possible using Java or Groovy?

解决方案

It turns out writing a user defined function is actually quite easy using SQLiteJDBC. Here's a Groovy example:

@GrabConfig(systemClassLoader=true)
@Grab('org.xerial:sqlite-jdbc:3.6.16')
import org.sqlite.*
import java.sql.*

db = groovy.sql.Sql.newInstance("jdbc:sqlite::memory:","org.sqlite.JDBC")

// a distance function using the spherical law of cosines
Function.create(db.getConnection(), "distance", new Function() {
    protected void xFunc() throws SQLException {
        def lat1 = value_double(0)
        def lon1 = value_double(1)
        def lat2 = value_double(2)
        def lon2 = value_double(3)

        double theta = lon1 - lon2;
        double dist = (Math.sin(deg2rad(lat1)) * Math.sin(deg2rad(lat2))) + 
            (Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * Math.cos(deg2rad(theta)))
        dist = Math.acos(dist)
        dist = rad2deg(dist)
        dist = dist * 60 * 1.1515
        dist = dist * 1.609344
        result(dist);
    }

    def deg2rad(deg) {
      deg * Math.PI / 180.0
    }

    def rad2deg(rad) {
      rad * 180.0 / Math.PI
    }
})

db.execute("CREATE TABLE city(name, lat, lon)")
db.execute("INSERT INTO city(name, lat, lon) VALUES('New York City', 40.7143, -74.0060)")
db.execute("INSERT INTO city(name, lat, lon) VALUES('San Francisco', 37.7749, -122.4194)")
db.execute("INSERT INTO city(name, lat, lon) VALUES('Paris', 48.8567, 2.3510)")
db.execute("INSERT INTO city(name, lat, lon) VALUES('Cologne', 50.9407, 6.9599)")

db.eachRow("SELECT a.name as a, b.name as b, distance(a.lat, a.lon, b.lat, b.lon) as d FROM city a, city b WHERE a.name != b.name ORDER BY d;") {
    println "Distance from ${it.a} to ${it.b}: ${it.d}km"
}

这篇关于使用Java或Groovy为SQLite编写用户定义的SQL函数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆