返回首页

gbase数据、南大通用产品文档:GBase8s

更新日期:2024年09月11日

Index/Count out of range
使用索引和计数值调用 Array.getArray() 或 Array.getResultSet() 。索引超出范围或计数值太
大。
请验证数组中的元素数满足索引和计数值。


GBase 8s JDBC Driver 程序员指南
南大通用数据技术股份有限公司
- 299 -

功能描述
创建一个新的PACKAGE。
注意事项

在package specification 中声明过的函数或者存储过程,必须在package body 中找到定
义。

在实例化中,无法调用带有commit/rollback 的存储过程。

不能在Trigger 中调用package 函数。

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
912

不能在外部SQL 中直接使用package 当中的变量。

不允许在package 外部调用package 的私有变量和存储过程。

不支持其它存储过程不支持的用法,例如,在function 中不允许调用commit/rollback,
则package 的function 中同样无法调用commit/rollback。

不支持schema 与package 同名。

只支持A 风格的存储过程和函数定义。

不支持package 内有同名变量,包括包内同名参数。

package 的全局变量为session 级,不同session 之间package 的变量不共享。

package 中调用自治事务的函数,不允许使用package 中的cursor 变量,以及递归的使
用package 中cursor 变量的函数。

package 中不支持声明refcursor 变量。

package 默认为SECURITY INVOKER 权限,如果想将默认行为改为SECURITY
DEFINER 权限,需要设置guc 参数behavior_compat_options='plsql_security_definer'。

被授予CREATE ANY PACKAGE 权限的用户,可以在public 模式和用户模式下创建
PACKAGE。

如果需要创建带有特殊字符的package 名,特殊字符中不能含有空格,并且最好设置
GUC 参数behavior_compat_options=“skip_insert_gs_source”,否则可能引起报错。
语法格式

CREATE PACKAGE SPECIFICATION 语法格式。
CREATE [ OR REPLACE ] PACKAGE [ schema ] package_name
[ invoker_rights_clause ] { IS | AS } item_list_1 END package_name;
invoker_rights_clause 可以被声明为AUTHID DEFINER 或者AUTHID INVOKER,
分别
为定义者权限和调用者权限。
item_list_1 可以为声明的变量或者存储过程以及函数。

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
913
PACKAGE SPECIFICATION(包规格)声明了包内的公有变量、函数、异常等,可以被外
部函数或者存储过程调用。在PACKAGE SPECIFICATION 中只能声明存储过程、函数,不
能定义存储过程或者函数。

CREATE PACKAGE BODY 语法格式。
CREATE [ OR REPLACE ] PACKAGE BODY [ schema ] package_name
{ IS | AS } declare_section [ initialize_section ] END package_name;
PACKAGE BODY(包体内)定义了包的私有变量、函数等。如果变量或者函数没有在
PACKAGE SPECIFICATION 中声明过,那么这个变量或者函数则为私有变量或者函数。
PACKAGE BODY 也可以声明实例化部分,用来初始化package。
示例
CREATE PACKAGE SPECIFICATION 示例
CREATE OR REPLACE PACKAGE emp_bonus IS
var1 int:=1;--公有变量
var2 int:=2;
PROCEDURE testpro1(var3 int);--公有存储过程,可以被外部调用
END emp_bonus;
/
CREATE PACKAGE BODY 示例
drop table if exists test1;
create or replace package body emp_bonus is
var3 int:=3;
var4 int:=4;
procedure testpro1(var3 int)
is
begin
create table if not exists test1(col1 int);
insert into test1 values(var1);
insert into test1 values(var5);
end;
begin
--实例化开始
var4:=9;
testpro1(var4);
end emp_bonus;

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
914
/
ALTER PACKAGE OWNER 示例
--将PACKAGE emp_bonus 的所属者改为gbase
ALTER PACKAGE emp_bonus OWNER TO gbase;
调用PACKAGE 示例
--使用call 调用package 存储过程
call emp_bonus.testpro1(1);
--使用select 调用package 存储过程
select emp_bonus.testpro1(1);
--匿名块里调用package 存储过程
begin
emp_bonus.testpro1(1);
end;
/

使用 SQLSetConnectAttr() 函数来指定服务器使用的回调函数。
SQLSetConnectAttr() 也用于指定回调函数使用的参数。参数属性按照为驱动程序指定的
方式传回回调函数。
下列属性是特定于 GBase 8s 的对 ODBC 标准的扩展:
参数
类型
描述

GBase 8s ODBC Driver 程序员指南
南大通用数据技术股份有限公司
- 21 -
参数
类型
描述
SQL_INFX_ATTR_PAM_FUNCTION
void * 指向回调函数的指针。
SQL_INFX_ATTR_PAM_RESPONSE_BUF
void * 指向包含对认证质询的响应的缓
冲区的通用指针。
SQL_INFX_ATTR_PAM_RESPONSE_LEN
int
响应缓冲区的长度,以字节计。
SQL_INFX_ATTR_PAM_RESPONSE_LEN_
PTR
int *
存储响应中的字节数的地址。
SQL_INFX_ATTR_PAM_CHALLENGE_BU
F
void * 指向包含认证质询的缓冲区的通
用指针。
驱动程序将从服务器收到
的任何质询都存储在此缓冲区内。
如果该缓冲区未大到足以包含该
质询,则截断质询。通过将缓冲区
长度与质询中的字节数相对比,

调函数可检测到此质询。
由应用程
序开发人员负责检测此情况,
并正
确地处理它。
SQL_INFX_ATTR_PAM_CHALLENGE_BU
F_LEN
int
质询缓冲区的长度,以字节计。
SQL_INFX_ATTR_PAM_CHALLENGE_LE
N_PTR
int *
存储质询中字节数的地址。
质询和响应缓冲区指针可为空。如果认证服务器要求存储缓冲区中的信息,则由于认证
失败导致连接失败。无论连接是否成功,都会返回质询长度信息。如果消息类型不需要
响应,则响应缓冲区可能为空(缺省的),或它可能包含空字符串。
可在任何时刻,以任何顺序来设置前面表中的属性。然而,它们仅对以驱动程序的连接
函数之一的后续调用建立的连接有效。
通过使用下列连接属性之一,使用 SQLSetConnectAttr() API 设置隔离级别:

SQL_TXN_READ_UNCOMMITTED = Read Uncommitted

SQL_TXN_READ_COMMITTED = Read Committed

SQL_TXN_SERIALIZABLE = Serializable

SQL_TXN_REPEATABLE_READ = Repeatable Read

SQL_TXN_LAST_COMMITTED = Last Committed

SQL_TXN_TRANSACTION = Transaction
如果随同 SQLSetConnectAttr() API 使用 SQL_TXN_LAST_COMMITTED 或
SQL_TXN_TRANSACTION 属性,则您的应用程序必须直接链接至 GBase 8s ODBC
Driver,而不连接至 ODBC Driver Manager。然而,如果在 odbc.ini 文件或 Data Source
Administrator 中指定该属性,则应用程序可以使用 ODBC Driver Manager 连接。
如果使用 SQL_TXN_TRANSACTION 属性,则将在 DTC 应用程序中设置的隔离级别
传播至服务器。仅应在 Windows™ DTC 应用程序中使用此选项。

GBase 8s ODBC Driver 程序员指南
南大通用数据技术股份有限公司
- 22 -
ODBC 驱动程序的默认行为是从 VARCHAR 列结果的结尾除去空字符。要保留结尾的
空白,请设置 SQL_INFX_ATTR_LEAVE_TRAILING_SPACES 属性:
SQLSetConnectAttr( hdbc, SQL_INFX_ATTR_LEAVE_TRAILING_SPACES,
(SQLPOINTER)SQL_TRUE, SQL_IS_INTEGER );
要除去结尾的空白,请将 SQL_TRUE 更改为 SQL_FALSE。
将该行为限定至连接。
连接池和认证
在 ODBC 中,驱动程序管理器控制连接池。
当使用认证时,应用程序编程人员必须意识到连接池的影响。驱动程序管理器不控制其
连接何时置于池中,
或者何时从池中拉出。
如果应用程序不了解用户就连接或断开连接,
则连接池的性能优势得以保持,用户不会收到任何意外的认证质询。如果应用程序未使
用户意识到他们正在重建连接,则仍没有认证问题,因为驱动程序管理器与服务器之间
的连接从未关闭。

连接函数
可随同认证模块使用任何建立连接的 ODBC 函数,SQLConnect()、SQLDriverConnect()
或 SQLBrowseConnect()。
当使用这些函数时,请考虑下列事项:
SQLConnect() 函数
SQLConnect() 函数的 DriverCompletion 参数可采用下列值

SQL_DRIVER_PROMPT

SQL_DRIVER_COMPLETE

SQL_DRIVER_COMPLETE_REQUIRED

SQL_DRIVER_NOPROMPT
如果预料到有认证挑战,则推荐您使用 SQL_DRIVER_NOPROMPT。使用其他值可能
导致用户面对认证信息的多个请求。
SQLBrowseConnect() 函数
设计 SQLBrowseConnect() 函数旨在反复使用,驱动程序为应用程序提供关于如何完成
连接字符串的指导,且应用程序提示用户所需的值。这可导致用户在连接字符串完成与
认证之间面对多个提示。
此外,
作为连接字符串完成进程的一部分,
驱动程序通常向应用程序提供数据库的选择。
然而,在用户通过身份验证之后,驱动程序才能为数据库的列表查询服务器。根据应用
程序逻辑,它是在原始的连接字符串中提供数据库名称,还是打算从认证服务器接受质
询,当服务器使用认证时,可能无法使用 SQLBrowseConnect()。


GBase 8s ODBC Driver 程序员指南
南大通用数据技术股份有限公司
- 23 -
第三方应用程序或中间代码
当使用认证时,应由应用程序处理来自认证服务器的任何质询。
要处理质询,
应用程序编程人员必须能够向驱动程序注册回调函数。
由于在 ODBC 标准
中未定义用来完成此任务的属性,因此,使用的属性为 GBase 8s 扩展。
以 Microsoft™ 的 ADO 层编写的许多应用程序从开发人员抽取 ODBC 调用。大多数
Visual Basic 应用程序都用 ADO 层编写。这些应用程序和第三方应用程序通常不知道
GBase 8s 扩展,且不能处理身份验证质询。
Windows™ 上的 ODBC Data Source Administrator 也属于第三方应用程序这一类。
当配置
UNIX™ 数据源时,不是所有特性都可用。例如,如果收到质询,则 Apply and Test
Connection 按钮和 User Server Database Locale 切换不起作用,
因为那些特性需要连接到
服务器的能力。