pljava

Java 程序语言

概览

扩展包名版本分类许可证语言
pljava1.6.10LANGBSD 3-ClauseJava
ID扩展名BinLibLoadCreateTrustReloc模式
3090pljavasqlj
相关扩展plpgsql plv8 plperl plpython3u pg_tle pllua plluau pltclu

missing debian/ubuntu pg18

版本

类型仓库版本PG 大版本包名依赖
EXTPGDG1.6.101817161514pljava-
RPMPGDG1.6.101817161514pljava_$v-
DEBPGDG1.6.91817161514postgresql-$v-pljava-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64PGDG MISS
d12.aarch64PGDG MISS
PGDG 1.6.9
PGDG 1.6.9
PGDG 1.6.9
PGDG 1.6.9
d13.x86_64PGDG MISS
d13.aarch64PGDG MISS
PGDG 1.6.9
PGDG 1.6.9
PGDG 1.6.9
PGDG 1.6.9
u22.x86_64PGDG MISS
u22.aarch64PGDG MISS
u24.x86_64PGDG MISS
u24.aarch64PGDG MISS

安装

您可以直接安装 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: PL/Java 过程语言

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');

最后修改 2026-03-14: update extension metadata (953cbd0)