当前位置: 首页 > 面试题库 >

使用Java或Groovy为SQLite编写用户定义的SQL函数?

郎聪
2023-03-14
问题内容

使用SQLite,可以使用C
api
或PHP轻松添加用户定义的SQL函数。但是也可以使用Java或Groovy吗?


问题答案:

事实证明,使用SQLiteJDBC编写用户定义的函数实际上非常容易。这是一个Groovy示例:

@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"
}


 类似资料:
  • 在本节中,将了解SQL Server用户定义的函数,包括返回单个值的标量值函数和返回数据行的表值函数。 SQL Server用户定义的函数通过封装复杂的业务逻辑并使其可在每个查询中重用,以简化开发。 用户定义的标量函数 - 涵盖用户定义的标量函数,用于封装复杂的公式或业务逻辑,并在每个查询中重用它们。 表变量 - 学习如何使用表变量作为用户定义函数的返回值。 表值函数 - 介绍内联表值函数和多语句

  • 问题内容: 我在数据库中创建了标量函数 现在,我想在.NET C#或VB.NET代码中运行它。 我使用实体框架,尝试使用功能映射对其进行映射,但未成功。我不在乎用简单的DbCommand来做到这一点,问题是我没有得到任何结果(该函数存在于Entities类中): 有什么解决办法吗?欢迎使用C#或VB.NET发布。 问题答案: 在这种情况下,听起来 正确的 方法是使用实​​体框架的功能来定义.NET

  • 问题内容: 我了解T-SQL不是面向对象的。我需要编写一组函数来模拟C#中的方法重载。 T-SQL是否以任何方式支持函数重载?如果有这样做的技巧,是否建议这样做? 问题答案: 不,没有办法做到这一点。 我建议您重新考虑该要求,因为“使苹果看起来像橘子”通常很难做到,而且价值可疑。

  • 我知道如何在SparkSQL中编写UDF: 我可以做类似的事情来定义聚合函数吗?这是怎么做到的? 对于上下文,我想运行以下SQL查询: 它应该会返回类似于 我希望聚合函数告诉我,在由< code>span和< code>timestamp定义的组中,是否有任何< code>opticalReceivePower的值低于阈值。我需要把我的UDAF写得和我上面粘贴的UDF不同吗?

  • 问题内容: 我正在处理大量旧数据(从平面文件db转换),其中字段的格式设置为输入记录的年份的最后2位,然后是4位的增量… 例如,1998年创建的第三条记录将为“ 980003”,而2004年创建的第十一条记录将为“ 040011”。 我无法更改这些值- 它们通过他们的公司存在,已经在州,客户等中注册。我知道将年份和其余年份分隔到单独的列中会很好,但这是不可能的。我什至不能真正做到“内部”,因为每一

  • 问题内容: 我决定检查数据仓库中的UDF(这在很大程度上应该是确定性的),并且发现了一些不应该的UDF。 例如: 显示在此查询中: 为什么是这样? 问题答案: Yikes- 显然,它需要SCHEMABINDING进行其他指定,否则可能会导致性能问题 通过修复这些问题,我可能会获得一些性能提升。好的。