返回首页

gbase数据、南大通用产品文档:GBase8sSQLJ Driver 内置过程

更新日期:2024年09月11日

使用 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。)

语法
IF(expr1,expr2,expr3)
函数说明
如果expr1 为TRUE 则IF()的返回值为expr2,如果expr1 取值为FALSE、0 或
NULL,则返回值为expr3。
IF()的返回值规则同CASE 表达式返回值的规则。
示例
示例1:expre1 的值为FALSE,返回值为expr3。
gbase> SELECT IF(FALSE,2,3) FROM dual;
+-------------+
| IF(FALSE,2,3) |
+-------------+
|
3 |
+-------------+
1 row in set
示例2:expre1 的值为TRUE,返回值为expr2。
gbase> SELECT IF(TRUE,'yes','no') FROM dual;
+--------------------+
| IF(TRUE,'yes','no') |
+--------------------+
| yes
|
+--------------------+
1 row in set
示例3:expr1 为表达式,值为TRUE,返回值为expr2。

GBase 8a MPP Cluster 产品手册
5 数据库管理指南
文档版本953(2022-09-15)
南大通用数据技术股份有限公司
680
gbase> SELECT IF(1<2,'no','yes') FROM dual;
+---------------------------------------+
| IF(1<2,'no','yes')
|
+---------------------------------------+
| no
|
+---------------------------------------+
1 row in set
示例4:expr1 为表达式,值不为TRUE,返回值为expr3。
gbase> SELECT IF(1>2,NULL,'no') FROM dual;
+-------------------+
| IF(1>2,NULL,'no') |
+-------------------+
| no
|
+-------------------+
1 row in set

|
3 | one2
| 2013-03-03 |