使用 SQLJ Driver 内置过程执行以下任务之一:
安装、替换或移除一组 Java 类
要为包含在 JAR 文件中的 Java 类指定 Java™ 类解析的路径
映射或删除用户定义类型与其对应的 Java 类型之间的映射
SQLJ Driver Built-In Procedures
GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1716
客户端应用程序必须指定 'sqli' 所有者名称以从兼容 ANSI 的数据库中调用这些
函数。
SQLJ 内置过程存储在 sysprocedures 系统目录表中。它们被分组到 sqlj 模式
下。
提示: 对于任何 Java 静态方法,执行的第一个内置过程必须是
sqlj.install_jar( ) 过程。在创建 UDR 或将用户定义数据类型映射到 Java 类
之前必须安装 JAR 文件。同样,不能使用任何其它 SQLJ 内置过程直到使用了
sqlj.install_jar( )。
sqlj.install_jar
使用 sqlj.install_jar( ) 过程在当前数据库中安装 JAR 文件,并为它指定一
个 JAR 标识符。
sqlj.install_jar
参数
描述
限制
语法
deploy
导致过程在 JAR 文件中搜寻部署描
述符文件的整数
无
精确数值
jar_file
包含以 Java 语言编写的 UDR 的
JAR 文件的 URL
URL 的最大长
度为 255 字
节
引用字符串
例如,假设 Java™ 类 Chemistry 包含下列静态方法 explosiveReaction( ):
GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1717
public static int explosiveReaction(int ingredient)
此处的 Chemistry 类驻留在服务器电脑上的这个 JAR 文件中:
/students/data/Courses.jar
您可以使用以下 sqlj.install_jar( ) 过程调用在当前数据库的 Courses.jar
文件中安装所有类:
EXECUTE PROCEDURE
sqlj.install_jar("file://students/data/Courses.jar", "course_jar");
sqlj.install_jar( ) 过程指定 JAR ID,course_jar,分配给它在当前数据库中安装的
Courses.jar 文件。
在数据库中定义 JAR ID 之后,可以在创建和执行以 Java 语言编写的 UDR 使
用该 JAR ID。(您必须拥有数据库的 Resource 特权或 DBA 特权,并且还必须
具有 Java 语言的 Usage 特权,才能创建或删除 Java UDR。)
当您为第三个参数指定一个非零数字时,数据库服务器将搜索任何包含的部署描
述符文件。例如,您可能希望包括包含 SQL 语句的描述符文件,以在 JAR 文件
中注册和授予对 UDR 的权限。
如果启用了 IFX_EXTEND_ROLE 配置参数(缺省设置),那么只有 DBSA 或
持有 EXTEND 角色的用户可以执行 sqlj.install_jar( ) 过程。当禁用
IFX_EXTEND_ROLE 时,任何用户都可以执行 sqlj.install_jar( )。
Jar 文件的文件权限
sqlj.install_jar( ) 在数据库中安装 JAR 文件之后,为此文件声明一个 JAR ID。
GBase 8s 只有在安装了 GBase 8s 实例的用户(通常为用户 gbasedbt)具有读取
该文件的权限的情况下才能访问该 JAR 文件的 JAR 文件所在的目录。例如,在
UNIX™ 系统上,这意味着尝试读取具有600 个权限的 JAR 文件失败,并显示
FILENOTFOUND 异常。然而,在 chmod 实用程序将权限设置为 660(rw-rw-
---)后,相同的操作会成功。
您必须拥有数据库的 Resource 特权或 DBA 特权,并且还必须具有 Java 语言的
Usage 特权,才能创建或删除 Java UDR。
GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1718
sqlj.replace_jar
使用 sqlj.replace_jar( ) 过程将先前安装的 JAR 文件替换为新版本。使用此
语法时,您只需提供新的 JAR 文件,并为其指定要替换的文件的 JAR ID。
sqlj.replace_jar
参数
描述
限制
语法
jar_file
包含以 Java 语言编写的
UDR 的 JAR 文件的 URL
URL 的最大长度是 255
字节。
引用字符串
如果尝试替换由一个或多个 UDR 引用的 JAR 文件,那么数据库服务器会生成
错误。在替换 JAR 文件之前,您必须删除引用的 UDR。
例如,以下调用将以前为 course_jar 标识符安装的 Courses.jar 文件替换为
Subjects.jar 文件:
EXECUTE PROCEDURE
sqlj.replace_jar("file://students/data/Subjects.jar", "course_jar");
在替换 Course.jar 文件之前,必须使用 DROP FUNCTION(或 DROP
ROUTINE)语句删除用户定义的函数 sql_explosive_reaction( )。(您必须拥有数
据库的 Resource 特权或 DBA 特权,并且还必须具有 Java 语言的 Usage 特
权,才能创建或删除 Java UDR。)
如果启用了 IFX_EXTEND_ROLE 配置参数(缺省设置),那么只有 DBSA 或
持有 EXTEND 角色的用户可以执行 sqlj.replace_jar( ) 过程。当禁用
IFX_EXTEND_ROLE 时,任何用户都可以执行 sqlj.replace_jar( )。
sqlj.remove_jar
使用 sqlj.remove_jar( ) 过程从当前数据库移除先前安装的 JAR 文件。您必
须拥有数据库的 Resource 特权或 DBA 特权,并且还必须具有 Java 语言的
Usage 特权,才能创建或删除 Java UDR。
sqlj.remove_jar
GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1719
参数
描述
限制
语法
deploy
导致过程在 JAR 文件中搜寻部署描述符文
件的整数
无
精确数值
当尝试移除被一个或多个 UDR 引用的 JAR 文件时,数据库服务器生成 46003
错误。您必须在替换此 JAR 文件前删除引用的 UDR。 非法 JAR 文件名称生成
46002 错误。
例如,下列 SQL 语句移除与 course_jar JAR ID 相关联的 JAR 文件:
DROP FUNCTION sql_explosive_reaction;
EXECUTE PROCEDURE sqlj.remove_jar("course_jar");
当您为第二个参数指定非零数字时,数据库服务器将搜索任何包含的部署描述符
文件。例如,您可能希望包括包含 SQL 语句的描述符文件以撤销关联的 JAR 文
件中的 UDR 特权,并从数据库中删除它们。
如果启用 IFX_EXTEND_ROLE 配置参数(缺省设置),那么只有 DBSA 或持
有 EXTEND 角色的用户可以执行 sqlj.remove_jar( ) 过程。当禁用
IFX_EXTEND_ROLE 时,任何用户都可以执行 sqlj.remove_jar( )。
sqlj.alter_java_path
使用 sqlj.alter_java_path( ) 指定当例程管理器解析用 Java 语言编写的
UDR 的 JAR 文件的相关的 Java 类时使用 jar 文件路径。
sqlj.alter_java_path
参数
描述
限制
语法
class_id
包含实现 UDR
的方法的 Java™
类
Java 必须在 jar_id 指定的 JAR
文件中存在。标识符不能超过 255
个字节。
特定于
语言
GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1720
参数
描述
限制
语法
package_id
包含 Java 类的
包的名称
package_id.class_id 的完整限定
标识符不能超过 255 个字符
特定于
语言
您指定的 JAR ID (即要更改 JAR 文件路径的 JAR 标识和 JAR ID 的解析)必
须都已使用 sqlj.install_jar 过程安装过。当调用使用 Java 语言编写的 UDR
时,例程管理器尝试加载 UDR 驻留的 Java 类。此时,它必须解析此 Java 类对
其它 Java 类所做的引用。
这些类引用的三种类型是:
1. 引用 JVPCLASSPATH 配置参数指定的 Java 类(例如 java.util.Vector
的 Java 系统类)
2. 引用与 UDR 位于同一 JAR 文件中的类
3. 引用包含 UDR 的 JAR 文件之外的类。
例程管理隐式解析之前列表中的类型 1 和类型 2。要解析类型 3 的引用,它检
查 JAR 文件路径中所有最近调用 sqlj.alter_java_path( ) 指定的 JAR 文件。
如果例程管理器不能解析类引用,它会发出异常。例程管理器在执行类型 1 和类
型 2 解析之后检查 JAR 文件路径以进行类引用。
如果希望从 JAR 文件路径指定的 JAR 文件加载 Java™ 类,请确保 Java 类不
存在于 JVPCLASSPATH 配置参数中。否则,系统装入程序会首先采用此 Java
类,这可能导致加载不是您期望的类。
假设 sqlj.install_jar( ) 过程和 CREATE FUNCTION 已经如前面部分所述的执
行。以下 SQL 语句调用 course_jar JAR 文件中的 sql_explosive_reaction( )
函数:
EXECUTE PROCEDURE alter_java_path("course_jar", "(professor/*, prof_jar)");
EXECUTE FUNCTION sql_explosive_reaction(10000);
例程管理器尝试加载 Chemistry 类。它使用调用 sqlj.alter_java_path( ) 指定的
路径来解析任何类引用。因此,它检查 prof_jar 标识的 JAR 文件的 professor
包中的类。
如果启用了 IFX_EXTEND_ROLE 配置参数(缺省设置),那么只有 DBSA 或
持有 EXTEND 角色的用户可以执行 sqlj.alter_java_path( ) 过程。当
GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1721
IFX_EXTEND_ROLE 被禁用时,任何用户都可以执行 sqlj.alter_java_path( )。
(但是不管 IFX_EXTEND_ROLE 如何设置,您必须拥有数据库的 Resource 特
权或 DBA 特权,并且还必须拥有 Java 语言的 Usage 特权,才能创建或删除
Java UDR。)
sqlj.setUDTextName
使用 sqlj.setUDTextName( ) 过程定义用户定义的数据类型和 Java 类之间的映
射。
sqlj.SetUDTextName
参数
描述
限制
语法
class_id
包含 Java 数据类
型的 Java 类
限定名称
package_id.class_id
不能超过 255 个字节
Java 标识符的
特定于语言的
规则
data_type
要创建映射的用户
定义的类型
名称不能超过 255 个字
节
标识符
package_id
包含 class_id
Java 类的包的名
称
与 class_id 的限制相
同
Java 标识符的
特定于语言的
规则
必须已经在 CREATE DISTINCT TYPE 、CREATE OPAQUE TYPE 或 CREATE
ROW TYPE 语句中注册此用户定义的数据类型。
要查找用户定义数据类型的 Java 类,数据库服务器将在 JAR 文件路径中搜索,
该路径由 sqlj.alter_java_path( )过程指定,有关 JAR 文件路径的更多信息,请
参阅 sqlj.alter_java_path。
SQLJ 驱动程序查找 CLASSPATH 在客户端环境中指定的路径,然后向数据库
服务器询问 Java 类的名称。
setUDTextName( ) 例程是使用 Java 编程语言规范的 SQLJ:SQL 例程的扩展。
GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1722
如果启用了 IFX_EXTEND_ROLE 配置参数(缺省设置),那么只有 DBSA 或
持有 EXTEND 角色的用户可以执行 setUDTextName( ) 过程。当
IFX_EXTEND_ROLE 被禁用时,任何用户都可以执行 setUDTextName( )。(但
是不管 IFX_EXTEND_ROLE 如何设置,您必须拥有数据库的 Resource 特权或
DBA 特权,并且还必须拥有 Java 语言的 Usage 特权,才能创建或删除 Java™
UDR。)
sqlj.unsetUDTextName
使用 sqlj.unsetUDTextName( ) 例程移除用户定义数据类型到 Java 类的映射。
sqlj.unsetUDTextName
参数
描述
限制
语法
data_type
要移除映射的用户定义的数据类型
必须存
在
标识符
此例程删除 SQL 到 Java 的映射,从而从数据库服务器的共享内存中删除 Java
类的任何缓存副本。
unsetUDTextName( ) 例程是使用 Java 编程语言规范的 SQLJ:SQL 例程的扩
展。
如果启用了 IFX_EXTEND_ROLE 配置参数(缺省设置),那么只有 DBSA 或
持有 EXTEND 角色的用户可以执行 unsetUDTextName( ) 过程。当
IFX_EXTEND_ROLE 被禁用时,任何用户都可以执行 unsetUDTextName( )。
(但是不管 IFX_EXTEND_ROLE 如何设置,您必须拥有数据库的 Resource 特
权或 DBA 特权,并且还必须拥有 Java 语言的 Usage 特权,才能创建或删除
Java™ UDR。)