如何在 SQL Server 语言扩展中调用 Java 运行时

适用于: SQL Server 2019 (15.x) 及更高版本

SQL Server 语言扩展功能使用 sp_execute_external_script 系统存储过程作为接口来调用 Java 运行时。

本操作说明文章介绍了在 SQL Server 上执行的 Java 类和方法的实现详细信息。

放置 Java 类的位置

可以采用两种方法在 SQL Server 中调用 Java 类:

  1. .class.jar 文件放置在 Java classpath 中。

  2. 使用 external library DDL 将 .jar 文件中的已编译类和其他依赖项上传到数据库中。

注意

通常建议使用 .jar 文件而不是单独的 .class 文件。 这在 Java 中是常见的做法,这将使整体体验更加轻松。 另请参阅从类文件创建 Java .jar 文件

使用类路径

基本原则

下面是在 SQL Server 上执行 Java 时的一些基本原则。

  • 已编译的自定义 Java 类必须存在于 Java classpath 中的 .class 文件或 .jar 文件中。 CLASSPATH 参数提供已编译的 Java 文件的路径。

  • 所调用的 Java 方法必须在存储过程上的 script 参数中提供。

  • 如果类属于某个包,则必须提供 packageName

  • params 用于将参数传递到 Java 类。 不支持调用需要参数的方法。 因此,参数是将实参值传递给方法的唯一途径。

注意

此说明重述了 SQL Server 2019 (15.x) 及更高版本中特定于 Java 的受支持和不受支持的操作。 在存储过程中,支持输入参数,而不支持输出参数。

调用 Java 类

sp_execute_external_script 系统存储过程是用于调用 Java 运行时的接口。 以下示例展示了一个使用 Java 扩展的 sp_execute_external_script,以及用于指定路径、脚本和您的自定义代码的参数。

注意

无需定义要调用的方法。 默认情况下,会调用名为 execute 的方法。 这意味着需要遵循 SQL Server 用于 Java 的 Microsoft 扩展性 SDK,并在 Java 类中实现 execute 方法。

DECLARE @param1 AS INT;

SET @param1 = 3;

EXECUTE sp_execute_external_script
    @language = N'Java',
    @script = N'<packageName>.<ClassName>',
    @input_data_1 = N'<Input Query>',
    @param1 = @param1;

设置 CLASSPATH

在编译一个或多个 Java 类或在 Java .jar 中创建 classpath 文件后,有两个选项可用于向 SQL Server Java 扩展提供路径:

  1. 使用外部库

    最简单的选项是通过创建外部库并将此库指向 jar 来使 SQL Server 自动找到你的类。 使用 Java 的外部库

  2. 注册系统环境变量

    你可以创建系统环境变量,并提供指向包含这些类的 .jar 文件的路径。 创建名为 CLASSPATH 的系统环境变量。

使用外部库

在 SQL Server 2019 (15.x) 及更高版本中,可以在 Windows 和 Linux 上使用适用于 Java 语言的外部库。 可以将类编译到.jar文件中,并使用 .jar DDL 将CREATE EXTERNAL LIBRARY文件和其他依赖项上传到数据库中。

如何使用外部库上传 .jar 文件的示例:

CREATE EXTERNAL LIBRARY myJar
    FROM (CONTENT = '<local path to .jar file>')
    WITH (LANGUAGE = 'Java');
GO

创建外部库时,SQL Server 将自动具有对 Java 类的访问权限,并且无需将任何特殊访问权限设置为 classpath。

以下代码展示了如何调用作为外部库上传的包中类的方法:

EXECUTE sp_execute_external_script
    @language = N'Java',
    @script = N'MyPackage.MyCLass',
    @input_data_1 = N'SELECT * FROM MYTABLE'
WITH RESULT SETS((column1 INT));

有关详细信息,请参阅 CREATE EXTERNAL LIBRARY

到 SQL Server 的 Loopback 连接

使用环回连接通过 JDBC 连接回 SQL Server,以从 sp_execute_external_script 执行的 Java 中读取或写入数据。 当无法使用 InputDataSetOutputDataSetsp_execute_external_script 参数时,可以使用此功能。 若要在 Windows 中建立环回连接,请使用以下示例:

jdbc:sqlserver://localhost:1433;databaseName=Adventureworks;integratedSecurity=true;

若要在 Linux 中建立环回连接,JDBC 驱动程序需要以下证书中定义的三个连接属性:

客户端证书身份验证