如何在 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. 使用外部库 DDL 将已编译的类上传到 .jar 文件中,并且将其他依赖项上传到数据库中。

注意

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

使用 Classpath

基本原则

下面是在 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 INT

SET @param1 = 3

EXEC 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 语言的外部库。 可以使用 CREATE EXTERNAL LIBRARY DDL 将类编译到 .jar 文件中,并将 .jar 文件和其他依赖项上传到数据库中。

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

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

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

以下代码是从上传为外部库的包调用类中的方法的示例:

EXEC 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 的环回连接

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

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

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

Client-Certificate-Authenication