pljava
Java 程序语言
概览
| 扩展包名 | 版本 | 分类 | 许可证 | 语言 |
|---|---|---|---|---|
pljava | 1.6.10 | LANG | BSD 3-Clause | Java |
| ID | 扩展名 | Bin | Lib | Load | Create | Trust | Reloc | 模式 |
|---|---|---|---|---|---|---|---|---|
| 3090 | pljava | 否 | 是 | 否 | 是 | 否 | 否 | sqlj |
| 相关扩展 | plpgsql plv8 plperl plpython3u pg_tle pllua plluau pltclu |
|---|
missing debian/ubuntu pg18
版本
| 类型 | 仓库 | 版本 | PG 大版本 | 包名 | 依赖 |
|---|---|---|---|---|---|
| EXT | PGDG | 1.6.10 | 1817161514 | pljava | - |
| RPM | PGDG | 1.6.10 | 1817161514 | pljava_$v | - |
| DEB | PGDG | 1.6.9 | 1817161514 | postgresql-$v-pljava | - |
安装
您可以直接安装 pljava 扩展包的预置二进制包,首先确保 PGDG 仓库已经添加并启用:
pig repo add pgdg -u # 添加 PGDG 仓库并更新缓存
使用 pig 或者是 apt/yum/dnf 安装扩展:
pig install pljava; # 当前活跃 PG 版本安装
pig ext install -y pljava -v 18 # PG 18
pig ext install -y pljava -v 17 # PG 17
pig ext install -y pljava -v 16 # PG 16
pig ext install -y pljava -v 15 # PG 15
pig ext install -y pljava -v 14 # PG 14
dnf install -y pljava_18 # PG 18
dnf install -y pljava_17 # PG 17
dnf install -y pljava_16 # PG 16
dnf install -y pljava_15 # PG 15
dnf install -y pljava_14 # PG 14
apt install -y postgresql-18-pljava # PG 18
apt install -y postgresql-17-pljava # PG 17
apt install -y postgresql-16-pljava # PG 16
apt install -y postgresql-15-pljava # PG 15
apt install -y postgresql-14-pljava # PG 14
创建扩展:
CREATE EXTENSION pljava;
用法
pljava 允许使用标准 JDBC API 在 PostgreSQL 中编写 Java 函数、触发器和类型。
CREATE EXTENSION pljava;
部署 Java 代码
将 Java 类打包到包含 SQLJ 部署描述符的 JAR 文件中,然后安装:
SELECT sqlj.install_jar('file:///path/to/my_functions.jar', 'myjar', true);
SELECT sqlj.set_classpath('public', 'myjar');
创建函数
编写包含静态方法的 Java 类:
package com.example;
import org.postgresql.pljava.annotation.Function;
public class MyFunctions {
@Function
public static int add(int a, int b) {
return a + b;
}
@Function
public static String hello(String name) {
return "Hello, " + name + "!";
}
}
声明 SQL 函数映射:
CREATE FUNCTION add(int, int) RETURNS int
AS 'com.example.MyFunctions.add'
LANGUAGE java;
CREATE FUNCTION hello(varchar) RETURNS varchar
AS 'com.example.MyFunctions.hello'
LANGUAGE java;
集合返回函数
实现 ResultSetProvider 接口以创建集合返回函数:
import org.postgresql.pljava.ResultSetProvider;
import java.sql.ResultSet;
import java.sql.SQLException;
public class MySetFunction implements ResultSetProvider {
public boolean assignRowValues(ResultSet receiver, int currentRow)
throws SQLException {
if (currentRow < 10) {
receiver.updateInt(1, currentRow);
receiver.updateString(2, "row " + currentRow);
return true;
}
return false;
}
public void close() {}
public static ResultSetProvider generate()
throws SQLException {
return new MySetFunction();
}
}
触发器函数
import org.postgresql.pljava.TriggerData;
import org.postgresql.pljava.annotation.Trigger;
public class MyTrigger {
@Trigger(called = Trigger.Called.BEFORE, table = "my_table",
events = {Trigger.Event.INSERT, Trigger.Event.UPDATE})
public static void auditTrigger(TriggerData td) throws SQLException {
ResultSet newRow = td.getNew();
newRow.updateTimestamp("modified_at",
new java.sql.Timestamp(System.currentTimeMillis()));
}
}
通过 JDBC 访问数据库
import java.sql.*;
public static int countUsers() throws SQLException {
Connection conn = DriverManager.getConnection("jdbc:default:connection");
PreparedStatement stmt = conn.prepareStatement("SELECT count(*) FROM users");
ResultSet rs = stmt.executeQuery();
rs.next();
return rs.getInt(1);
}
JAR 管理
SELECT sqlj.install_jar('file:///path/to/jar', 'jarname', true);
SELECT sqlj.replace_jar('file:///path/to/new.jar', 'jarname', true);
SELECT sqlj.remove_jar('jarname', true);
SELECT sqlj.set_classpath('schemaname', 'jar1:jar2');
SELECT sqlj.get_classpath('schemaname');