Tivoli 服务台 6.0 开发工具包脚本语言参考
返回主页
开始事务
FUNCTION SQLBeginWork: INTEGER;
当每个 SQL 语句成功完成时,TSD 脚本一般要承诺这个 SQL 语句。但是,有很多的时侯,您要同时承诺或回退一系列 SQL 语句。在调用 SQLCommit 或 SQLRollBack 之前,SQLBeginWork 将暂停自动承诺每个 SQL 语句。
承诺或回退之后,事务终断,TSD 脚本重新开始自动承诺。必须再次调用 SQLBeginWork,以开始另一个事务。
KNOWLEDGEBASE Example;
--PUBLIC ROUTINES
FUNCTION Test:INTEGER;
PRIVATE ROUTINES
FUNCTION Test:INTEGER IS VARIABLES
ok : BOOLEAN; ACTIONS
(* start the transaction (transaction) ==> this disables the normal automatic committing after every SQL operation *) SQLBeginWork;
(* do your work here ok := .... *)
IF ok THEN SQLCommit; (* save changes since SQLBeginWork *) ELSE SQLRollBack; (* reverse changes since SQLBeginWork *) END;
(* After a commit or rollback the transaction will be terminated. *) (* Call SQLBeginWork again to start the next transaction if you don't *) (* want the automatic committing *)
END; --Test--
返回码 | 说明 |
1 | 成功完成 |
(其它) | 请参见 Tivoli 服务台 6.0 开发工具包脚本编程指南 |
关闭打开的游标及准备好的语句,并断开打开的 DBMS 连接。
FUNCTION SQLCloseAll: INTEGER;
虽然不是必需的,但在退出主 .kb 文件之前,仍应当调用此例程。它承诺进行中的任何事务。
KNOWLEDGEBASE Example;
--PUBLIC ROUTINES
FUNCTION Test:INTEGER;
PRIVATE ROUTINES
FUNCTION Test:INTEGER IS ACTIONS (* perform some SQL operations... *)
SQLCloseAll; END;
返回码 | 说明 |
1 | 成功完成 |
(其它) | 请参见 Tivoli 服务台 6.0 开发工具包脚本编程指南 |
关闭以前通过调用 SQLSelect 打开的游标。
FUNCTION SQLCloseCursor(cursor: SQLCURSOR): INTEGER;
注意:回退操作将关闭所有游标(请参见 SQLRollBack)。
大多数驱动程序不允许您指定可以跨越多个工作单元的游标(例如,用 WI TH HOLD 声明它们)。DB2 CLI 驱动程序是个例外。在承诺操作之后将关闭全部游标。因此,在提取循环中如果执行 SQL 操作(如更新),您必须禁用在每个 SQL 语句之后的自动承诺。
注:在执行承诺和回退操作之前,应当关闭所有游标。
自变量名称 | 说明 |
游标 | 这是类型 SQLCursor 的参数,它是通过以前调用 SQLSelect 设置的。 |
当完成时,SQLCloseCursor 将游标设为 $Unknown。用以前关闭的游标调用 SQLCloseCursor 会退出并返回错误。不显示任何错误消息。
KNOWLEDGEBASE Example;
--PUBLIC ROUTINES
FUNCTION Test:INTEGER;
PRIVATE ROUTINES
FUNCTION Test:INTEGER IS VARIABLES (* columns *) name: STRING; (* misc *) cursor: SQLCursor; retCd: INTEGER; ACTIONS (* select all employees *) retCd := SQLSelect(cursor,'* from emp'); IF (retCd < 0) THEN EXIT retCd; END;
retCd := SQLFetch(cursor,name); WHILE (retCd > 0) DO (* perform some operations based on this row...
. . . *)
(* get the next record *) retCd := SQLFetch(cursor); END;
(* now close the cursor *) SQLCloseCursor(cursor);
END;
返回码 | 说明 |
1 | 成功地关闭游标 |
(other) | 请参见 Tivoli 服务台 6.0 开发工具包脚本编程指南 |
关闭以前通过 SQLPrepare 打开的(准备好的)语句。
FUNCTION SQLCloseStatement(statement: SQLSTATEMENT): INTEGER;
回退操作会毁坏全部准备好的语句。承诺操作关闭全部准备好的、没有引用打开游标的语句。
注:在执行承诺或回退操作之前,应当用 SQLCloseStatement 手动关闭所有受影响的语句。
自变量名称 | 说明 |
statement | 通过调用 SQLPrepare,初始化语句参数。 |
所有驱动程序都支持 SQLCloseStatement。当完成时,SQLCloseStatement 将语句设为 $Unknown。
通过以前关闭的语句调用 SQLCloseStatement会退出,并返回错误。不显示任何错误消息。
KNOWLEDGEBASE Example;
--PUBLIC ROUTINES
FUNCTION Test(REF users: LIST OF STRING):INTEGER;
PRIVATE ROUTINES
FUNCTION Test(REF users: LIST OF STRING):INTEGER IS VARIABLES stmt: SQLStatement; retCd: INTEGER; ACTIONS SQLBeginWork
(* insert the user names passed in *) retCd := SQLPrepare(stmt,'INSERT INTO USERS VALUES (?)'); IF (retCd < 0) THEN SQLRollBack; (* terminate the transaction *) EXIT retCd; END;
FOR users DO retCd := SQLExecute(stmt,users[$current]); IF retCd < 0 THEN SQLCloseStatement(stmt); SQLRollBack; (* reverse changes and release locks *) EXIT retCd; END; END; (* for *)
(* close the prepared statement *) SQLCloseStatement(stmt); SQLCommit; (* save changes and release locks *) END;
返回码 | 说明 |
1 | 成功完成 |
(其它) | 请参见 Tivoli 服务台 6.0 开发工具包脚本编程指南 |
向 SQL 解释器发出依赖于实现的、非 SQL 的命令。
FUNCTION SQLCommand(sub_command: STRING): INTEGER;
自变量名称 | 说明 |
sub_command | 命令字符串由两部分组成:第一部分是数据库管理器子命令;第二部分包含此命令中的所有函数。此命令不区分大小写。所有参数用空格分开。关于可用的子命令,请参见下一部分。 |
如下表所示,SQLCommand 语句有许多的子命令。
某些子命令需要 connection_handle_string。要指定当前选择的源数据库,您可以在 $Current 中传递。或者,如果不做任何指定,则使用当前选择的源数据库。
要获取连接句柄字符串,用子命令 GET CURRENT CONNECTION 调用 SQLCommand。然后可以将整数返回值指定到字符串。此字符串为 connection_handle_string。
还有一些指定 source_name 的子命令。(源名称参数一直是可选的。) 要指定当前连接的源,您可以在 $Current 中传递。要指定缺省的数据源,您可以传递 $Default。如果不指定源名称,则假设 $Current 为源名称。
下表显示 SQLCommand ('<sub_command>')
的子命令及其参数和说明。参数列中的值由用户提供。
子命令 | 参数 | 说明 |
CONNECT | connect_string | 打开与 DBMS 的连接。在进行任何 SQL 操作之前,必须调用此命令。通常它是由应用程序调用的第一批语句中的一个语句。如果不提供 connect_string,将连接到缺省的数据源。成功地进行连接之后,此连接成为当前选择的连接。 |
DISCONNECT | connection_handle_string | 断开由 connection_handle_string 引用的连接。连接句柄是个整数,连接之后通过立即调用 SQLCommand (GET CURRENT CONNECTION) 可以获取它。 |
GET CASE CONVERSION | source_name | 返回对象名称(而不是数据)大小写的转换模式:
0 = 无 1 = 大写 2 = 小写 负返回码表示错误。 |
GET CASE SENSITIVITY | source_name | 通知 Tivoli 服务台开发工具包,DBMS 是否具有区分大小写的对象名称(例如表名称、列名称等)。这不应用到数据 (虽然对于某些 DBMS,如 SQLServer,同时存在区分大小写的对象名称和区分大小写的数据)。 可能的返回值为: 0 = 不区分大小写 1 = 区分大小写 |
GET CATALOG CASE CONVERSION | source_name | 返回系统目录表中数据的当前大小写的转换模式: 0 = 无 1 = 大写 2 = 小写 负返回值表示错误。 |
GET CHECK DRIVER | source_name | 如果(连接时)执行检查以确定驱动程序(例如,CDSS06.DLL) 是否为不支持的驱动程序之一,则返回 TRUE,否则 返回 FALSE。 |
GET CURRENT CONNECTION | source_name | 返回当前选择连接的整数连接句柄。如果接收到小于零的返回码,请参见错误代码定义页的其他信息。 |
GET CURRENT ODBC HENV | 返回 Tivoli 服务台开发工具包使用的实际 ODBC 环境句柄。这只应用于使用 ODBC 驱动程序时。 负返回值表示错误。 | |
GET CURRENT ODBC HDBC | 返回 Tivoli 服务台开发工具包当前主连接的实际 ODBC 连接句柄。这只应用于使用 ODBC 驱动程序时。负返回值表示错误。 | |
GET DATE FORMAT | source_name | 返回 DBMS 的当前日期格式。 |
GET DBMS | source_name | 返回命名为 source_name 的源 DBMS 的整数代码。可能的返回值为:0 或 2 (DB2/);1 (Oracle);3,23 或 24 (SQLServer);4 或 12 (SYBASE) 及 16 或 17 (INFORMIX)。 |
GET IN TRANSACTION | connection_handle | 如果事务在进行中(换句话说,已经调用 SQLBeginWork,而还没有调用 SQLCommit 或 SQLRollback),则返回 1。0 返回码表示没有进行中的事务。负返回码表示错误。 |
GET MODULE | 返回您使用的 SQL 库的整数代码。这只提供向后兼容。 模块代码的可能值为:2 = (多平台 - X/OPEN 和 ODBC)。 | |
GET MODULE TYPE | 返回当前的模块类型。这只提供向后兼容。可能值为:5 = X/OPEN 注:这类似于 GET MODULE 子命令,只是 GET MODULE 映射 ODBC 为 Q+E 版本 2,以用于向后兼容。 |
|
GET MULTI CONNECT | source_name | 如果命名为 source_name 的源支持多个同时连接,则返回 1。 |
GET SHOW WARNINGS | source | 如果启用警告消息框,则返回 TRUE;否则返回 FALSE。 |
GET TIME FORMAT | source_name | 返回 DBMS 的当前时间格式。 |
GET UPDATE LOCK STYLE | source_name | 返回当前锁定的样式: 0 = 无 1 = 选择用于更新 2 = 更新 负返回码表示错误。 |
GET UPDATE MODE | source_name | 返回被动并行的更新模式。可能值为: 0 = 无 1 = 选择 2 = DBMS 优化 负返回码表示错误。 |
RESTORE CURRENT QUALIFIER | 在内部堆栈上提取最近保存限定符的值,并将其作为当前连接的当前限定符。 | |
RESTORE CURRENT SYSQUALIFIER | 在内部堆栈上提取最近保存系统表限定符的值,并将其作为当前连接的当前系统限定符。 | |
SAVE CURRENT QUALIFIER | 存储当前表限定符的值,用于内部堆栈上的当前连接。 | |
SAVE CURRENT SYSQUALIFIER | 存储当前系统表限定符的值,用于内部堆栈上的当前连接。 | |
SET CASE CONVERSION | conversion | 设置对象名称(而不是数据)的大小写的转换模式。转换的有效值为:NONE、UPPER 和 LOWER。 |
SET CASE SENSITIVITY | true | false | 通知 Tivoli 服务台开发工具包,当前的 DBMS 是否具有区分大小写的对象名称(例如表名称、列名称等)。这不适用于数据(虽然对于某些 DBMS,如 SQLServer,同时存在区分大小写的对象名称和区分大小写的数据)。 |
SET CATALOG CASE CONVERSION | conversion | 设置系统目录表中数据的当前大小写的转换模式。转换的有效值为 UPPER、LOWER 和 NONE。 |
SET CHECK DRIVER | true | false | 设置用于执行驱动程序有效检查的当前状态。 |
SET CONNECTION | connection_handle_string | 设置当前选择的连接为 connection_handle_string 引用的句柄。 |
SET CURRENT QUALIFIER | qualifier | 设置表限定符为当前所选择连接的限定符。 |
SET CURRENT SYSQUALIFIER | qualifier | 设置系统表限定符为当前所选择连接的限定符。 |
SET DBMS | dbms | 允许替换当前识别的 DBMS。(请参见 GET DBMS 获取 DBMS 值的列表。) |
SET SHOW WARNINGS | true | false | 设置用于显示警告消息框的当前状态。 |
SET UPDATE LOCK STYLE | style | 允许您在本地设置当前的锁定样式。样式的有效值为:NONE、SELECT FOR UPDATE 和 UPDATE。 |
SET UPDATE MODE | none | select | dbms_optimistic | 通知 Tivoli 服务台开发人员应当如何执行被动并行: NONE - 不将原始数据与数据库比较。SELECT - 执行记录的 SQL 选择,将它与被动并行机制中使用的原始记录比较,以检测是否已经更改记录的 DBMS 版本。 DBMS_OPTIMISTIC - 试图使用 DBMS 特定的被动并行机制,以检测是否已经更改记录的 DBMS 版本。 |
START USING DATABASE | database_name | 此命令将当前活动的数据库切换为 database_name。 |
TRACE ALERT DESTINATION | file name | 设置由跟踪计时器生成的所有提示消息的目标文件。 如果使用,将信息附加到指定的文件。缺省情况下,此文件命名为 sql_trc.alr。 注:将信息连接到现有文件。这与 TRACE FILE 命令不同,TRACE FILE 命令将信息截断到指定的文件。 |
TRACE AUTO FLUSH | true | false | 如果 TRACE AUTO FLUSH 设为 TRUE,则每次写入时都清仓(写入磁盘)到跟踪文件的输出。一般来说,只有当完成跟踪时,或操作系统决定清仓缓冲区时,才将日志输出写入磁盘。 操作系统失败可能导致丢失部分或全部跟踪信息。TRACE AUTO FLUSH 命令强制信息存入文件,以确保操作系统失败不导致丢失输出。缺省值为 TRUE。 注:文件访问频率将影响性能。 |
TRACE ENABLED | true | false | 确定是启用还是禁用跟踪。如果当前不存在 TRACE ENABLED,则缺省值为 FALSE。 |
TRACE FILE | file name | 将跟踪文件输出到指定的文件。每次启动跟踪时,此文件被截断,除非已经指定附加(请参见 TRACE APPEND)。如果不提供 TRACE_FILE 参数,则在当前目录下创建缺省跟踪文件 sql_trc.log。 |
TRACE FILE APPEND | true | false | 当传递 TRUE 时,附加任何现有的跟踪文件;如果传递 FALSE,则覆盖任何现有的文件。在任何一种情况下,如果不存在跟踪文件,则创建它。缺省值是 FALSE。 |
TRACE INDENT INCR | integer | 控制用于嵌套块缩进的空格数。缺省值是 4 个空格。 |
TRACE MAX LINE LENGTH | integer | 设置环绕发生前,输出跟踪文件行的最大长度值。缺省值为 2000000000,这实际上是禁用。 |
TRACE MAX NUM FETCHES | integer | 设置日志文件中记录的结果集行的数目。这也是使用 SQLPrepare/SQLExecute 组合时记录的执行数目。缺省值为 3。 |
TRACE MAX PARAMETER SIZE | integer | ALL | NONE | 设置输出到日志文件的数据量(以字节/列为单位),它们是 SQL 命令返回的结果。如果指定 ALL,则总是写入整个语句。如果您指定 NONE,则禁用列数据跟踪,并且不记录结果数据。如果指定 0,则在记录中出现列名称,但不记录数据。 TRACE MAX PARAMETER SIZE 的缺省值为 256 字节。 |
TRACE MAX STATEMENT SIZE | integer | ALL | 设置日志文件记录输出的大小。如果指定 ALL,则总是不截断地记录整个语句。缺省值为 1024 字节。 |
TRACE MSG | Message Text | 将消息文本存放入跟踪日志文件。 |
TRACE SEPARATOR | string | 允许使用用户指定的字符串,以替代缺省值 "==>"。在跟踪输出中,使用它可以快速的查找块。 |
TRACE START TIMER | timer name [/i=indent_spaces] [/a=milliseconds] [/q] | 使用提供的唯一标识符启动计时器。在日志文件中显示它,以给出引用点。/i 参数控制时间间隔内记录事件的缩进级(空格数)。/i 的缺省值为 0。 /a 参数(可选)允许给出提醒前时间间隔的上限。 /q 参数(可选)用于没有日志文件输出时的安静模式输出。当 /q 参数不存在时,输出按正常情况记录到文件。 注: SQL 初始化调用隐式 TRACE_START_TIMER。 |
TRACE STATEMENTS | 这是要记录的语句类型列表,每个用加号(+)分开。要有效的禁用记录,将标志设为 NONE。缺省值为 ALL。 | |
TRACE STOP TIMER | timer name | 终断以匹配调用 TRACE_START_TIMER 启动的定时会话。(不区分大小写地匹配唯一的计时器名称。)
当定时会话结束时,复位缩进级并记录定时结果,除非在 TRACE START TIMER 中使用 /q (安静)参数,抑制到日志文件的输出。 注:用去除初始化(SQLCloseAll 或程序中断)调用隐式的 TRACE STOP TIMER 。 |
WRITE LAST ERROR MSG | file_name | 将上次的 DBMS 错误消息写入 file_name。此命令不写入由 Tivoli 服务台开发工具包生成的错误消息(例如,INVALID CURSOR HANDLE)。 |
您可以用环境变量 SAISQLTRCFILE 和 SAISQLTRCENABLED 设置跟踪选项的子集。
SAISQLTRCFILE 设置跟踪文件名。例如,要从命令行设置此环境变量,您可以输入:
SET SAISQLTRCFILE=c:\trc\trc.log.
SAISQLTRCENABLED 启用或禁用 SQL 跟踪。例如,要从命令行设置此环境变量,您可以输入:
SET SAISQLTRCENABLED=TRUE.
KNOWLEDGEBASE Example;
--PUBLIC ROUTINES
FUNCTION Test:INTEGER IS VARIABLES connectionHandle, retCd, dbms, module, caseSensitive, caseConvert: INTEGER;
ACTIONS (*connect to the data source*) retCd := SQLCommand('CONNECT SOURCE=ADV_ORACLE;QUAL= EXAV;UID=TIM;');
IF (retCd < 0) THEN EXIT retCd; END;
(* get the current connection handle*) connectionHandle := SQLCommand ('GET CURRENT CONNECTION'); IF (retCd < 0) THEN EXIT retCd; END;
(* set the current connection*) ret := SQLCommand ('SET CONNECTION' & connectionHandle); IF (retCd < 0) THEN EXIT retCd; END;
(*disconnect from the current connection*) retCd := SQLCommand ('DISCONNECT'); IF (retCd < 0) THEN EXIT retCd; END;
(*disconnect from a specified connection*) retCd := SQLCommand ('DISCONNECT' & connectionHandle); IF (retCd < 0) THEN EXIT retCd; END;
(* get the current DBMS type*) dbms := SQLCommand ('GET DBMS'); IF (retCd < 0) THEN EXIT retCd; END;
(* get the DBMS type for a specific data source *) dbms := SQLCommand ('GET DBMS TEST'); IF (retCd < 0) THEN EXIT retCd; END;
(* get SAI_SQL.DLL module type *) module := SQLCommand ('GET MODULE'); IF (retCd < 0) THEN EXIT retCd; END;
(* get whether or not the DBMS is case-sensitive *) caseSensitive := SQLCommand ('GET CASE SENSITIVITY'); IF (retCd < 0) THEN EXIT retCd; END;
(* get the current case conversion mode *) caseConvert := SQLCommand ('GET CASE CONVERSION'); IF (retCd < 0) THEN EXIT retCd; END;
(* set the current case conversion mode for the current connection *) ret := SQLCommand ('SET CASE CONVERSION upper'); IF (retCd < 0) THEN EXIT retCd; END;
(* save the current qualifier for the current connection *) ret := SQLCommand ('SAVE CURRENT QUALIFIER'); IF (retCd < 0) THEN EXIT retCd; END;
(* get the date format for the named ADVISOR *) ret := SQLCommand('GET DATE FORMAT ADVISOR'); IF (retCd < 0) THEN EXIT retCd; END;
(* get the time format for the source to which I am currently connected *) ret := SQLCommand('GET TIME FORMAT'); IF (retCd < 0) THEN EXIT retCd; END;
(* set the current qualifier for the current connection *) ret := SQLCommand('SET CURRENT QUALIFIER Fred'); IF (retCd < 0) THEN EXIT retCd; END;
(* restore the current qualifier for the current connection *) ret := SQLCommand('RESTORE CURRENT QUALIFIER'); IF (retCd < 0) THEN EXIT retCd; END;
(* switch databases *) ret := SQLCommand('START USING DATABASE advisor'); IF (retCd < 0) THEN EXIT retCd; END;
END; --Test--
返回码 | 说明 |
1 | 成功完成 |
(其它) | 请参见 Tivoli 服务台 6.0 开发工具包脚本编程指南 |
有关下列信息,请参见 Tivoli 服务台 6.0 开发工具包脚本编程指南:
向 SQL 解释器发出 SQL Commit Work 命令,这样可以接受本事务进行期间所做的全部更改。
FUNCTION SQLCommit: INTEGER;
如果准备的语句不引用打开的游标,则承诺会导致语句关闭。在执行承诺之前,您应当手工关闭所有准备的语句。
大多数驱动程序不允许指定可以跨越多个工作单元的游标(例如,用 WITH HOLD 声明它们)单元。DB2 CLI 驱动程序是个例外。承诺操作之后将关闭全部游标。因此,如果在提取循环中执行 SQL 操作(如更新),您必须禁用在每个 SQL 语句之后的自动承诺。
注:在执行承诺和回退操作之前,应当关闭所有游标。
当每个 SQL 语句完成时,TSD 脚本一般要承诺它。然而,当在事务内部运行 SQL 语句组时,您必须用 SQLCommit 或 SQLRollBack 手工承诺或回退事务。
调用 SQLCommit (或 SQLRollBack) 之后,当前的事务被终断,并且自动承诺重新开始。要启动另一个事务,必须再次调用 SQLBeginWork。
KNOWLEDGEBASE Example;
--PUBLIC ROUTINES
FUNCTION Test(REF age: INTEGER):INTEGER;
PRIVATE ROUTINES
FUNCTION Test(REF age: INTEGER):INTEGER IS VARIABLES (* misc *) retCd: INTEGER; ACTIONS (* begin a transaction *) SQLBeginWork;
(* delete all employees whose age is > age passed in *) retCd := SQLDelete('emp','age > ' & age); IF retCd < 0 THEN SQLRollBack; (* terminate this transaction *) EXIT retCd; END;
(* commit changes and release locks *) SQLCommit; END;
返回码 | 说明 |
1 | 成功完成 |
(其它) | 请参见 Tivoli 服务台 6.0 开发工具包脚本编程指南 |
如果记录字段包含搜索准则,SQLCreateSearchString 创建有效的 SQL WHERE 子句(没有 WHERE)。
FUNCTION SQLCreateSearchString(VAL tableName: STRING, REF searchString: STRING, VAL searchRec: any record or list of any record): INTEGER;
当执行不区分大小写的搜索时,TSD 脚本自动调用相应的大写函数。在多数场合,不使用索引进行搜索。要在搜索中使用索引,应当指定区分大小写的运算符。
自变量名称 | 说明 |
tableName | 要搜索的表或视图 |
searchString | 它包含 SQLCreateSearchString 生成的搜索字符串 |
searchRec | 此参数不是包含搜索准则的单个记录,就是包含搜索准则的记录列表 |
SQLCreateSearchString 用于创建 WHERE 子句,以传递过来的记录或记录列表内容为基础。如果传递记录列表,则用 OR 逻辑运算符组合由每个列表要素生成的子句。在记录内,用 AND 逻辑运算符组合由每个字段生成的子句。
关于 SQLCreateSearchString 请注意如下内容:
值 | 说明 |
(无) | 如果在查询屏幕不指定运算符,则执行区分大小写的搜索。允许使用索引。 |
= | 等于时,不区分大小写(用于运算符字段不存在,或运算符字段为 $Unknown:database:querying 时)。 |
> | 大于时,不区分大小写。 |
< | 小于时,不区分大小写。 |
>= | 大于或等于时,不区分大小写。 |
<= | 小于或等于时,不区分大小写。 |
<> | 不等于时,不区分大小写。 |
== | 等于时,区分大小写。 |
>> | 大于时,区分大小写。 |
<< | 小于时,区分大小写。 |
>= | 大于或等于时,区分大小写。 |
<= | 小于或等于时,区分大小写。 |
<<>> | 不等于时,区分大小写。 |
IS NULL | 如果列当前为 NULL,则为 TRUE。当您使用 IS NULL 运算符时,对应列字段的值不相干。但是对应列的字段必须存在。 |
IS NOT NULL | 如果列当前不是 NULL,则为 TRUE。当您使用 IS NOT NULL 运算符时,对应列字段的实际值不相干。但是对应列的字段必须存在。 |
_LO 和 _HI 后缀表示字段的低和高的范围值。例如,如果 age 对应于表的列的一个字段,age_lo 等于 21 ,age_hi 等于 65,则生成的搜索准则为:
'(age >= 21) AND (age <= 65)'. s:
当您使用 _LO 和 _HI 范围运算符时,对应列字段的值是不相干的。但是对应列的字段必须存在。
如果 _LO 或 _HI 范围运算符字段不存在,或为 $Unknown,则禁用范围特性,并使用对应列字段的值。如果 _OP 运算符字段存在,并且值为 <>,则范围运算符为 > 和 <。其它情况下使用缺省值 (>= 和 <=)。
如果列为字符串类型,您可以使用 * 和 ? 通配符字符,以执行通配符搜索:
在内部,* 和 ? 通配符转换为 SQL LIKE 子句,与 % 和 _ 兼容。如果存在 _OP 运算符字段,并且值为 <>,则选择与搜索准则不匹配的行(即,生成 NOT LIKE 子句)。
KNOWLEDGEBASE Example;
--PUBLIC ROUTINES
FUNCTION Test:INTEGER;
PRIVATE ROUTINES
FUNCTION Test:INTEGER IS
TYPES SearchRecord IS RECORD ssn: INTEGER; title: STRING; title_op: STRING; salary: REAL; age_lo:integer; age_hi:integer; age_op:string; name: STRING; name_lo:string; name_hi:string; name_op:string; age: INTEGER; married: BOOLEAN; MARRIED_OP:STRING; rating: REAL; addr: STRING; addr_OP: STRING; bDate: DATE; bTime: TIME; sysDT: STRING; sysDT_op: STRING; END; (* SearchRecord *)
VARIABLES r : SearchRecord; searchString : STRING; cursor: SQLCursor; ret : INTEGER;
ACTIONS
(* These values would normally come from a custom dialog box. *)
r.title_op := '<>'; r.title := 'PROGRAMMER'; (* ( (title <> 'PROGRAMMER) AND *) r.ssn := 315687890; (* (ssn = 316700056) AND *) r.name := 'Pamela*'; (* (name LIKE 'Pamela%') AND *) r.name_op := '=='; (* perform a case-sensitive search *) r.age := 30; (* ((age >= 13) AND (age <= 49)) AND *) r.age_lo := 13; r.age_hi := 49; r.age_op := '='; r.MARRIED_OP := 'is NOT null'; (* (married IS NOT NULL) AND *) r.rating := 43.457; (* (rating = 43.457) *) r.addr := '5051 ?. Morris *'; (* (addr NOT LIKE '5050 _. Morris %') AND *) r.bTime := {14,09,16}:TIME; (* (bTime = '14:09:16') AND *) r.bDate := {06,26,1985}:DATE; (* (bDate= '06/26/1985') AND *) r.sysDT := '1961-10-10-14.09.16.00'; (* (sysDT >= '1961-10-10-14.09.16.00)) *) r.sysDT_op := '>=';
SQLCreateSearchString('emps',searchString,r);
ret := SQLSelect(cursor, 'emps',searchString); IF ret < 0 THEN Exit ret; END;
ret := SQLFetch(cursor,r); WHILE ret > 0 DO
(* process r... *)
ret := SQLFetch(cursor); END;
SQLCloseCursor(cursor); END;
返回码 | 说明 |
1 | 成功完成 |
(其它) | 请参见 Tivoli 服务台 6.0 开发工具包脚本编程指南 |
删除表中指定的行。
SQLDelete(tableName: STRING, queryString: STRING [,expressionList...]): INTEGER;
注意:因为调用一次 SQLDelete 可以删除许多行,所以仔细指定 where 语句是非常重要的。
自变量名称 | 说明 |
tableName | 要从中进行删除的表名称。 |
queryString | where 语句。 |
expressionList | 这是零个或多个表达式的列表,每个表达式用逗号分开。例如: 3.4,age + 100,name,'Fred',Sin(45),... |
查询字符串中的 WHERE 关键字是可选的。
SQLDelete 允许参数标记替换。要使用参数标记,请在语句字符串中插入问号 (?)。这作为以后替换值的占位符。
此值从可选表达式列表中产生,该列表跟在语句字符串后面。 表达式的数目必须与参数标记 (?) 的数目相匹配,并且表达式顺序也必须与标记的顺序相匹配。
Tivoli 服务台开发工具包不能用参数标记提供增强型检查。例如:
retCd = SQLDelete('emp','WHERE name = ?',name);
包含在变量名内的字符串不必使用单引号。您不需要使用变量。 例如:
retCd = SQLDelete('emp','WHERE name = ?','Smith');
KNOWLEDGEBASE Example;
--PUBLIC ROUTINES
FUNCTION Test(REF AGE: INTEGER):INTEGER;
PRIVATE ROUTINES
FUNCTION Test(REF AGE: INTEGER):INTEGER IS VARIABLES retCd: INTEGER; ACTIONS (* delete all employees from Indiana, and whose age is greater than *) (* the age passed into this function. *) retCd := SQLDelete('emp','(state = ''IN'') AND (age >> ' & age & ')'); IF (retCd < 0) THEN EXIT retCd; END;
END;
返回码 | 说明 |
1 | 成功完成 |
(其它) | 请参见 Tivoli 服务台 6.0 开发工具包脚本编程指南 |
删除当前游标位置的行。
SQLDeleteCurrent(cursor: SQLCURSOR): INTEGER;
自变量名称 | 说明 |
cursor | 必须是以前调用 SQLSelect 已经打开的游标。 |
SQLDeleteCurrent。
即使不更新,当删除一行时,您也应当使用 SQLSelect 中的 FOR UPDATE OF 子句。然后 SQL 解释器对应地使用锁定。如果不提供 FOR UPDATE OF 子句,则按只读处理选择。
对于 SQLUpdateCurrent,在 FOR UPDATE OF 子句中,必须指定每个更新列,而使用 SQLDeleteCurrent 时与前者不同,仅指定一个列就够了。必须指定至少一个有效列;不能使用 *。
KNOWLEDGEBASE Example;
--PUBLIC ROUTINES
FUNCTION Test(REF age: INTEGER):INTEGER;
PRIVATE ROUTINES
FUNCTION Test(REF age: INTEGER):INTEGER IS
VARIABLES (* columns *) name: STRING; (* misc *) cursor: SQLCursor; retCd: INTEGER; ACTIONS SQLBeginWork
(* select all employees from Indiana, and whose age is greater than *) (* the age passed into this function. *) retCd := SQLSelect(cursor,'name from emp WHERE (state = ''IN'') AND ' & '(age > ' & age & ') FOR UPDATE OF NAME');
IF (retCd < 0) THEN SQLRollBack; (* terminate this transaction *) EXIT retCd; END;
retCd := SQLFetch(cursor,name); WHILE (retCd > 0) DO (* possibly perform some operation(s) based on "name" *)
(* now delete this row *) retCd := SQLDeleteCurrent(cursor); IF (retCd < 0) THEN SQLCloseCursor(cursor); SQLRollback; (* reverse any changes, and release locks *) EXIT retCd; END;
(* get the next record *) retCd := SQLFetch(cursor); END;
SQLCloseCursor(cursor); SQLCommit; (* accept changes and release locks *) END;
返回码 | 说明 |
1 | 成功完成 |
(其它) | 请参见 Tivoli 服务台 6.0 开发工具包脚本编程指南 |
执行准备的语句。
SQLExecute(statement: STATEMENT [,expressionList...]): INTEGER;
回退操作自动关闭所有打开的(准备的) 语句和游标(请参见 SQLRollBack)。承诺操作关闭所有打开的语句,该语句不引用打开的游标。
注:在任何时间,打开语句数都被限定在 20 个之内。
自变量名称 | 说明 |
statement | 这是具有准备格式、从 SQLPrepare 获取的语句。 |
expressionList | 这是零个或多个表达式的列表,每个表达式用逗号分开。例如,3.4,age + 100,name,'Fred',Sin(45),... |
如果在循环中多次执行一个命令,则使用 SQLPrepare 准备命令一次,然后在循环中使用 SQLExecute 执行准备的版本,可能要快一些。
SQLExecute 允许参数标记替换。要使用参数标记,请在语句字符串中插入问号 (?)。
这作为以后替换值的占位符。 此值从可选表达式列表中产生,该列表跟在语句字符串后面。 表达式的数目必须与参数标记 (?) 的数目相匹配,并且表达式顺序也必须与标记的顺序相匹配。
Tivoli 服务台开发工具包不能用参数标记提供增强型检查。例如:
retCd = SQLPrepare(stmt, 'UPDATE emp SET name= ? WHERE ssn=?);
包含在变量名内的字符串不必使用单引号。您不需要使用变量。 例如:
retCd = SQLExecute (stmt, 'Smith', 317689630);
在紧循环中,使用有效的 SQLPrepare/SQLExecute 组合替代 SQLUpdate、SQLExecuteImmediate 等,参数标记使您能够进行某些操作(如更新)。
KNOWLEDGEBASE Example;
--PUBLIC ROUTINES
FUNCTION Test(REF users: LIST OF STRING):INTEGER;
PRIVATE ROUTINES
FUNCTION Test(REF users: LIST OF STRING):INTEGER IS VARIABLES stmt: SQLStatement; retCd: INTEGER; ACTIONS SQLBeginWork; (* start a transaction *)
(* insert the user names passed in *) retCd := SQLPrepare(stmt,'INSERT INTO USERS VALUES (?)'); IF (retCd < 0) THEN SQLRollBack; (* terminate this transaction *) EXIT retCd; END;
FOR users DO retCd := SQLExecute(stmt,users[$current]); IF (retCd < 0) THEN SQLRollBack; (* reverse changes and release locks *) EXIT retCd; END; END; (* for *)
SQLCloseStatement(stmt); SQLCommit; (* accept changes and release locks *) END;
返回码 | 说明 |
1 | 成功完成 |
(其它) | 请参见 Tivoli 服务台 6.0 开发工具包脚本编程指南 |
直接从其字符串格式执行 SQL 语句。
SQLExecuteImmediate(sqlCommand: STRING [,expressionList...]): INTEGER;
自变量名称 | 说明 |
sqlCommand | 这必须是完整的、语法正确的 SQL 命令(语句),已经动态准备好它,但不是 SELECT 命令。 |
expressionList | 这是零个或多个表达式的列表,每个表达式用逗号分开。例如,3.4,age + 100,name,'Fred',Sin(45),... |
SQLExecuteImmediate 允许您执行几乎所有的 SQL 命令,但 SELECT 命令和不能动态准备的命令除外。
如果在循环中多次执行一个命令,则准备命令一次,然后在循环中执行准备好的版本,可能要快一些。
可以使用 Tivoli 服务台开发工具包的内置字符串处理函数,以帮助您建立命令字符串。
Tivoli 服务台开发工具包不执行 SQLExecuteImmediate 中的限定扩展。您仍然可以使用 $QUAL 和 $SYSQUAL。
注:SQLExecuteImmediate 允许参数标记替换。
要使用参数标记,请在语句字符串中插入问号 (?) 。这作为以后替换值的占位符。 此值从可选表达式列表中产生,该列表跟在语句字符串后面。 表达式的数目必须与参数标记 (?) 的数目相匹配,并且表达式顺序也必须与标记的顺序相匹配。
Tivoli 服务台开发工具包不能用参数标记提供增强型检查。例如:
retCd = SQLExecuteImmediate('UPDATE emp SET name = ? WHERE ssn = ?',name,ssn);
包含在变量名内的字符串不必使用单引号。您不需要使用变量。 例如:
retCd =SQLExecuteImmediate('UPDATE emp SET name = ? WHERE ssn?','Smith', 316798965);
KNOWLEDGEBASE Example;
--PUBLIC ROUTINES
FUNCTION Test:INTEGER;
PRIVATE ROUTINES
FUNCTION Test:INTEGER IS VARIABLES (* table columns of emp *) sDate: DATE; (* 'integer' *) name: STRING; (* 'char(15)' *) age: INTEGER; (* 'smallint' *) ssn: INTEGER; (* 'integer' *) married: BOOLEAN; (* 'smallint' *) salary: REAL; (* 'float' *) rating: REAL; (* 'decimal(8,3)' *) addr: STRING; (* 'varchar(81)' *) sp: SPACE; (* 'varchar(2500) *) lsp: SPACE; (* 'long varchar for bit data *) bDate: DATE; (* 'date' *) bTime: TIME; (* 'time' *) sTime: TIME; (* 'integer' *) sysDT: STRING; (* 'timestamp' *)
(* misc *) retCd: INTEGER; s: STRING;
ACTIONS
SQLExecuteImmediate('DROP TABLE tsql');
s := 'CREATE TABLE tsql (name CHAR(15), ' & 'age SMALLINT, ' & 'married SMALLINT, ' & 'ssn INTEGER, ' & 'salary FLOAT, ' & 'rating DECIMAL(8,3), ' & 'addr VARCHAR(81), ' & 'sp VARCHAR(2500), ' & 'lsp LONG VARCHAR FOR BIT DATA, ' & 'bdate DATE, ' & 'btime TIME, ' & 'sdate INTEGER, ' & 'stime INTEGER, ' & 'sysDT TIMESTAMP) ' & 'PRIMARY KEY(ssn))'; retCd := SQLExecuteImmediate(s);
EXIT retCd; END;
返回码 | 说明 |
1 | 成功完成 |
(其它) | 请参见 Tivoli 服务台 6.0 开发工具包脚本编程指南 |
有关其它信息,请参见 SQL 文档。
将游标下一行提取到指定的参数。
SQLFetch(cursor: SQLCURSOR [,parameterList...]): INTEGER;
注意:如果您使用预初始化的提取最佳条件选配,应确保在执行后续的(初始化的)提取时,仍然能够见到第一次(初始化)提取时列出的参数(列变量)。当初始化提取、参数和已初始化的提取都在同一函数内时,情况总是这样。
注:回退操作会关闭全部游标。如果在提取循环中间发生回退,下次调用 SQLFetch 将失败。
自变量名称 | 说明 |
cursor | 游标必须是以前调用 SQLSelect 打开的游标。 |
parameters | 这是用逗号分开的、零个或多个参数(列变量)的列表,这些参数的名称必须与对应的列名称相匹配(请参见此语句的注释)。 |
SQLFetch 具有两种最佳条佳选配形式。第一种形式在游标之后列出全部参数(列变量);第二种形式则只有游标。第一种形式被称作初始化提取,因为它对 Tivoli 服务台开发工具包进行初始化,以提供快速插入参数。第二种形式假设被提取的参数与最近一次调用第一种形式的提取时所指定参数一样。第二种形式称为初始化的或预初始化的提取。
当 Tivoli 服务台开发工具包察觉到提取参数后,如果您不再次指定参数,它会显著的加快。(这会导致 Tivoli 服务台开发工具包不必要的重新初始化参数。)
注:有关使用预初始化提取的详细信息,请参见此语句的注意部分。
参数名称必须与各自的列名称匹配。忽略其名称与列名称不匹配的任何参数。如果列名称以 SQLColumn_ 开始,并且以对应于选择列表的位置的列编号结束,则为例外情况。用这种方法,您可以访问列(集合)函数的结果。
例如,如果选择的字符串为:
SELECT count(*) FROM emp
并且声明 SQLColumn_1 是 INTEGER 类型变量,则您可以用下列命令提取计数:
SQLFetch(cursor,$SQLColumn_1);
在参数列表内,$SQLColumn_xx 参数的顺序无关紧要。
例如,如果名称是字符列,年龄是数字列,您选择的字符串为:
SELECT name,age FROM emp
并且您声明 $SQLColumn_xx 变量为
$SQLColumn_1: STRING; $SQLColumn_2: INTEGER;
然后下列命令将提取名称放入 $SQLColumn_1,将年龄放入 $SQLColumn_2:
SQLFetch(cursor,$SQLColumn_1,$SQLColumn_2);
下列命令也相同:
SQLFetch(cursor,$SQLColumn_2,$SQLColumn_1);
虽然此例中使用 STRING 和 INTEGER,您可以对
$SQLColumn 定义除 LIST 或 WINDOWS 之外的任何有效的 TSD 脚本的数据类型。
您可以把记录作为参数传递。在这种情况下,字段名称必须与表的列名称匹配,否则将忽略它们。
KNOWLEDGEBASE Example;
--PUBLIC ROUTINES
FUNCTION Test(REF age: INTEGER):INTEGER;
PRIVATE ROUTINES
FUNCTION Test(REF age: INTEGER):INTEGER IS VARIABLES VARIABLES (* columns *) name: STRING; (* misc *) cursor: SQLCursor; retCd: INTEGER; ACTIONS SQLBeginWork; (* start a transaction *)
(* select all employees from Indiana, and whose age is greater *) (* than the age passed into this function. *) retCd := SQLSelect(cursor,'name from emp WHERE (state = ''IN'') AND ' & '(age > ' & age & ') FOR UPDATE OF NAME'); IF (retCd < 0) THEN SQLRollBack; (* terminate the transaction *) EXIT retCd; END;
retCd := SQLFetch(cursor,name); WHILE (retCd > 0) DO (* possibly perform some operations based on "name"
. . . *)
(* set name to uppercase *) name := StrUpper(name);
(* now update this row *) retCd := SQLUpdateCurrent(cursor,name); IF (retCd < 0) THEN SQLCloseCursor(cursor); SQLRollback; (* reverse any changes, and release locks *) EXIT retCd; END;
(* get the next record *) retCd := SQLFetch(cursor); END;
SQLCloseCursor(cursor); SQLCommit; (* accept changes and release locks *) END;
返回码 | 说明 |
1 | 成功完成 |
(其它) | 请参见 Tivoli 服务台 6.0 开发工具包脚本编程指南 |
将数据值转换为您当前连接到的 DBMS 的相应数据格式的字符串。
SQLFormat(value: SIMPLE EXPRESSION): STRING;
DBMS 要求的日期和时间的格式,可能与显示所用日期和时间的格式不同。例如,缺省的 Oracle 日期格式为 DD-MON-YY,而美国工作站上的缺省 Tivoli 服务台开发工具包的格式为 MM/DD/YYYY。
自变量名称 | 说明 |
value | 这必须是简单的类型(如 DATE 或 STRING) |
SQLFormat 返回格式化字符串,而不是返回码,这表示操作是否成功。如果传递的值是 $Unknown,则返回字符串“NULL”。 字符串的特定格式由字符串类型来决定:
返回格式化的字符串。如果传递的值是 $Unknown,则返回字符串“NULL”。
KNOWLEDGEBASE Example;
--PUBLIC ROUTINES FUNCTION GetCount(VAL d: DATE): INTEGER;
PRIVATE ROUTINES FUNCTION GetCount(VAL d: DATE): INTEGER IS VARIABLES retCd: INTEGER; cmd : STRING; $SQLColumn_1 : INTEGER; ACTIONS cmd := 'SELECT COUNT(*) FROM COMPANIES WHERE name = ' & SQLFormat('Joe''s place') & ' AND founded_date ' & SQLFormat(d); retCd := SQLSelectInto(cmd, $SQLColumn_1); IF retCd < 0 THEN Exit( retCd ); ELSE Exit( $SQLColumn_1 ); END; END;
有关日期和时间格式、整数和实数格式的详细信息,请参见第三章中的 "数据类型格式标志"。
有关 sai_sql.cfg 文件的详细信息,请参见 6.0 开发工具包脚本编程指南。
获取游标 SQL 解释器内部使用的、用于指定游标的实际游标的名称。
SQLGetCursorName(cursor: SQLCURSOR, cursorName: STRING):
INTEGER;
自变量名称 | 说明 |
cursor | 必须是以前调用 SQLSelect 已经打开的游标。 |
cursorName | 游标的名称 |
SQLGetCursorName。
KNOWLEDGEBASE Example;
--PUBLIC ROUTINES
FUNCTION Test(REF age: INTEGER):INTEGER;
PRIVATE ROUTINES
FUNCTION Test(REF age: INTEGER):INTEGER IS VARIABLES (* columns *) name: STRING; (* misc *) cursor: SQLCursor; cursorName: STRING; retCd: INTEGER; ACTIONS (* select all employees from Indiana, and whose age is greater *) (* than the age passed into this function. *) retCd := SQLSelect(cursor,'name from emp WHERE (state = ''IN'') AND ' & '(age > ' & age & ') FOR UPDATE OF NAME'); IF (retCd < 0) THEN EXIT retCd; END;
SQLGetCursorName(cursor,cursorName);
retCd := SQLFetch(cursor,name); WHILE (retCd > 0) DO
(* possibly perform some operations based on "name" and "cursorName" . . . *)
(* get the next record *) retCd := SQLFetch(cursor); END; SQLCloseCursor(cursor); END;
返回码 | 说明 |
1 | 成功完成 |
(其它) | 请参见 Tivoli 服务台 6.0 开发工具包脚本编程指南 |
检索配置或环境状态选项的值。
SQLGetOption(VAL option: STRING, REF optionValue : <ANY SIMPLE VARIABLE> [, VAL srcOrConn : <INTEGER OR STRING EXPRESSION>]) : INTEGER;
注意:与 SQL 配置文件(sai_sql.cfg)中的选项不一样,对于传递给 SQLGetOption 的选项名称,使用空格而不是下划线来分隔。
注:用 SQLGetOption 可获取的大多数选项都可以用 SQLSetOption 来设置。
自变量名称 | 说明 |
option | 选项的名称(如:'DATE FORMAT')。请参见“注释”部分获取完整列表。 |
optionValue | 设为选项值的变量; |
srcOrConn | 此自变量是可选的,如果提供它,必须包括源名称 (STRING) 或连接句柄 (INTEGER)。如果不传递此参数,则假设为 $CURRENT。 |
此函数返回成功或错误代码。最常见的错误代码是:INVALID_OPTION 和 NOT_CONNECTED (对于那些需要您连接的选项,大多数都是这种情况)。
此函数包括 SQLCommand ('GET ... ') 中以前的功能;具有能返回 STRING 数据的优势。
以下为可以用此命令指定的选项:
选项 | 说明 |
'BIND PARAMETER BUFFER SIZE' | 返回用于参数绑定的缓冲区大小。 |
'BIND PARAMETER FILL OUTPUT NULL VALS' | 如果输出值 NULL 设为零,则返回 TRUE。 |
'BIND PARAMETER PAD OUTPUT STRINGS' | 如果将输出参数字符串以空格扩充到指定的精度,则返回 TRUE。 |
'BOOLEAN FORMAT' | 返回用于在 DBMS 中存储逻辑值的格式。关于数据格式的详细信息,请参阅本指南中的第三章。 |
'BOOLEAN PARAMETER PRECISION' | 返回用于绑定布尔值的精度。 |
'BOOLEAN PARAMETER TYPE' | 返回用于绑定布尔值的 X/Open 数据类型。 |
'BOOLEAN STORAGE TYPE' | 返回用于表示布尔值的存储类型。可能值为:
1 - INTEGER 2 - STRING 3 - BOOLEAN |
'CASE CONVERSION' | 返回由 Tivoli 服务台开发工具包使用的用于对象名称(不适用于数据)的大小写的转换。可能值为: 1 - 大写 2 - 小写 3 - 无 |
'CASE SENSITIVITY' | 如果数据库区分对象名称(不适用于“数据”的区分大小写)的大小写,则返回 TRUE。 |
'CATALOG CASE CONVERSION' | 返回由 Tivoli 服务台开发工具包使用的、用于目录视图 (SAI_SYSCOLUMNS 和 SAI_SYSTABLES) 中的数据的大小写转换。可能值为: 1 - 大写 2 - 小写 3 - 无 |
'CHECK DRIVER' | 如果 Tivoli 服务台开发工具包执行检查,以查看是否列出不支持的驱动程序,则返回 TRUE。 |
'COLUMN CATALOG METHOD' | 返回 Tivoli 服务台开发工具包使用的,以获取列目录值的方法。可能值为: 1 - 使用标准方法查询列 目录。 2 - 使用 DBMS 特定方法查询列目录。 3 - 使用 ODBC SQLColumn() 函数。 |
'COMMIT SELECTS' | 如果手工承诺为 TRUE,则可使用。在只读工作单元之后返回是否执行承诺。 |
'CONFIG FILE' | 返回连接时由 Tivoli 服务台开发工具包使用的配置文件的名称。要得到此值,您不一定要连接。 |
'CONNECTION' | 返回连接句柄。可以用 SQLGetOption 得到此选项,但不能用 SQLSetOption 设置它。 |
'CURRENT COL BUFFER' | 返回当前列缓冲区的大小。 |
'CURRENT ROW BUFFER' | 返回当前行缓冲区的大小。 |
'DATE FORMAT' | 返回 DBMS 的日期格式。关于数据格式的详细信息,请参阅本指南中的第三章。 |
'DATE PARAMETER PRECISION' | 返回用于绑定日期值的精度。 |
'DATE PARAMETER TYPE' | 返回用于绑定日期值的 X/Open 数据类型。 |
'DATE STORAGE TYPE' | 返回用于代表日期的存储类型。可能值为: 1 - INTEGER 2 - STRING 6 - DATE |
'DBMS' | 返回 DBMS (数字)。当前可识别的 DBMS 为: 0 - DB2/2, DB2/6000, DB2/NT, DB2/UX 1 - ORACLE 2 - DB2 3 - SQL SERVER 4.x 4 - SYBASE 5 - NETWARE SQL 6 - GUPTAN SQLBASE 7 - XDB 8 - DBASE 9 - BTRIEVE 10 - ASCII TEXT 11 - EXCEL 12 - SYBASE 10 (and above) 13 - PARADOX 14 - INGRES3 15 - INGRES4 16 - INFORMIX4 17 - INFORMIX5 18 - TANDEM 19 - PROGRESS 20 - HP ALLBASE 21 - WATCOM 22 - FULCRUM 23 - MS SQL SERVER 6.x 24 - (OTHER) |
'DBMS STRING' | 返回下列数据库名称: DB2、ORACLE、SQLSERVER、SYBASE 或 DBMS_OTHER。 |
'DSN' | 返回当前的 ODBC 数据源名称(只在连接到 ODBC 数据源时)。 |
'HAS TRANSACTIONS' | 如果 DBMS 支持事务处理,则返回 TRUE。 |
'IN TRANSACTION' | 如果用 SQLBeginWork 启动事务,并且未承诺或回退,则返回 TRUE。您可以用 SQLGetOption 得到此选项,但不能用 SQLSetOption 设置它。 |
'INTEGER FORMAT' | 返回 DBMS 的整数格式。关于数据格式的详细信息,请参阅本指南中的第三章。 |
'INTEGER PARAMETER PRECISION' | 返回用于绑定整数值的精度。 |
'INTEGER PARAMETER TYPE' | 返回用于绑定整数值的 X/Open 数据类型。 |
'INTEGER STORAGE TYPE' | 返回用于表示整数的存储类型。可能值为:
1 - INTEGER 2 - STRING |
'LAST ERROR MSG' | 返回最新的 DBMS 错误消息文本。 |
'MANUAL COMMITS' | 如果 SAI_SQL (而不是驱动程序)控制承诺行为,则返回 TRUE。 |
'MAX LITERAL LEN' | 返回字符串字母长度的最大值,在此值之后 Tivoli 服务台开发工具包对插入和和更新执行参数绑定。 |
'MODULE' | 只用于向后兼容。返回模块的类型。Tivoli 开发工具包 5.0 的唯一可能值是 5 (X/Open)。 |
'MODULE TYPE' | 只用于向后兼容。返回模块的类型。Tivoli 开发工具包 5.0 的唯一可能值是 5 (X/Open)。 |
'MULTI CONNECT' | 如果 DBMS 支持客户机进程的多个连接,则返回 TRUE。 |
'MULTI CONNECT REQUIRED' | 如果 DBMS 需要多个连接,以便服务多个、同步的 ("嵌套的") SQL 语句,则返回 TRUE。 |
'NEEDS CODEPAGE TRANSLATION' | 如果 Tivoli 服务台开发工具包要执行 ANSI 到 OEM 和 OEM 到 ANSI 代码页的转换(只有 Windows),则返回 TRUE。 |
'PROCESS RESULTS ON FREESTMT' | 如果 Tivoli 服务台开发工具包确保在没有行返回之前,整个结果集通过提取而清仓,则返回 TRUE。 |
'QUAL' | 返回限定符(通常为创建者或所有者)用于访问数据表。 |
'REAL FORMAT' | 返回 DBMS 的实数格式。关于数据格式的详细信息,请参阅本指南中的第三章。 |
'REAL PARAMETER PRECISION' | 返回用于绑定实数值的精度。 |
'REAL PARAMETER SCALE' | 返回用于绑定实数值的比例。 |
'REAL PARAMETER TYPE' | 返回用于绑定实数值的 X/Open 数据类型。 |
'REAL STORAGE TYPE' | 返回用于表示实数的存储类型。可能值为: 2 - STRING 3 - REAL |
'SHOW WARNINGS' | 如果显示警告消息框,则返回 TRUE。 |
'SOURCE' | 返回当前连接的 SAI_SQL 数据源的名称。 |
'STRING FORMAT' | 返回 DBMS 的字符串格式。关于数据格式的详细信息,请参阅本指南中的第三章。 |
'STRING PARAMETER PRECISION' | 返回用于绑定字符串值的精度。 |
'STRING PARAMETER TYPE' | 返回用于绑定字符串值的 X/Open 数据类型。 |
'SYSQUAL' | 返回访问系统目录表所要求的限定符。 注:Tivoli 服务台开发工具包版本 4.1.0 和以上版本使用 SAI 创建的包装视图,以用于目录信息,其中使用 SYSQUAL 创建视图(如, EXAV),而不是一般的系统限定符(如,SYSIBM)。 |
'TABLE CATALOG METHOD' | 返回 Tivoli 服务台开发工具包使用的以获取表目录值的方法。可能值为: 1 - 使用标准方法查询列 目录。 2 - 使用 DBMS 特定方法查询列 目录。 3 - 使用 ODBC SQLTable() 函数。 |
'TIME FORMAT' | 返回 DBMS 的时间格式。关于数据格式的详细信息,请参阅本指南中的第三章。 |
'TIME PARAMETER PRECISION' | 返回用于绑定时间值的精度。 |
'TIME PARAMETER TYPE' | 返回用于绑定时间值的 X/Open 数据类型。 |
'TIME STORAGE TYPE' | 返回用于表示时间的存储类型。可能值为: 1 - INTEGER 2 - STRING 5 - TIME |
'TRACE ALERT DESTINATION' | 返回提醒文件(如果使用提醒)的文件名。 |
'TRACE APPEND' | 如果每次附加跟踪文件(而不是替换),则返回 TRUE。 |
'TRACE AUTO FLUSH' | 如果每次写入之后,都把跟踪输出清仓以写入跟踪文件,则返回 TRUE。 |
'TRACE ENABLED' | 如果已经启用跟踪,则返回 TRUE。 |
'TRACE FILE' | 返回跟踪输出文件名。 |
'TRACE INDENT INCR' | 返回使用的缩进增量。 |
'TRACE MAX LINE LENGTH' | 返回行长度的最大值,在此之后,会发生环绕。 |
'TRACE NUM EXECUTES' | 返回 loggedSQLFetch 和 SQLExecute 语句的最大数。 |
'TRACE PARAM SIZE' | 返回写入文件的参数的最大长度。 |
'TRACE SEPARATOR' | 返回使用的跟踪输出分隔符。 |
'TRACE STATEMENT SIZE' | 返回写入文件的语句的最大长度。 |
'TRACE STATEMENTS' | 返回当前跟踪语句的位屏蔽。 |
'TRANSLATE FUNC' | 返回 DBMS 大写函数的名称。 |
'UPDATE LOCK COLUMN' | 返回用于被动并行锁定(通常为 MODIFY_DATETIME)的列(名称)。 |
'UPDATE LOCK ERROR FILTER' | 返回执行被动并行更新锁定时使用的错误过滤器级别。可能值为: 0 - 致命的(缺省值) 1 - 错误 2 - 警告 3 - 信息 |
'UPDATE LOCK STYLE' | 返回用于被动并行更新的锁定类型。可能值为: 1 - 选择用于更新 2 - 更新 3 - 更新其它 |
'UPDATE MODE' | 返回被动并行更新模式(算法)。可能值为: 1 - 选择 2 - DBMS 优化 3 - 无 |
返回码 | 说明 |
1 | 成功完成 |
(其它) | 请参见 Tivoli 服务台 6.0 开发工具包脚本编程指南 |
KNOWLEDGEBASE Example;
--PUBLIC ROUTINES PROCEDURE Example; PRIVATE ROUTINES PROCEDURE Example IS VARIABLES retCd: INTEGER; dateFormat : INTEGER; lastErrorMsg : STRING; hConn : INTEGER; ACTIONS retCd := SQLGetOption('LAST ERROR MSG' lastErrorMsg); retCd := SQLGetOption('DATE FORMAT', dateFormat, 'ADVISOR'); retCd := SQLGetOption('CONNECTION', hConn); retCd := SQLGetOption('DATE FORMAT', dateFormat, hConn); END;
在指定的表内插入新的一行。
SQLInsert(tableName: STRING [,parameters...]): INTEGER;
自变量名称 | 说明 |
tableName | 要在其中进行插入的表的名称。 |
parameters | 这是用逗号分开的、零个或多个参数(列变量)的列表,这些参数的名称必须与对应的列名称相匹配(有关的详细信息,请参见此语句的“注释”)。 |
传递到 SQLInsert 的参数(列变量),必须具有与表的实际列一样的名称。如果参数名称与任何列名称不匹配,则忽略此参数。
注:不需为表中的所有列传递参数,只需为创建为 NOT NULL 的列传递参数。
请不要试图将值为 $Unknown 的 Tivoli 服务台开发工具包参数,插入其中相对应列是用 NOT NULL 选项创建的表中。您可以把记录作为参数传递。在这种情况下,字段名称必须与表的列名称匹配,否则将其忽略。
KNOWLEDGEBASE Example;
--PUBLIC ROUTINES
FUNCTION Test:INTEGER;
PRIVATE ROUTINES
FUNCTION Test:INTEGER IS VARIABLES (* column names *) name: STRING; ssn: INTEGER; (* misc *) retCd: INTEGER; ACTIONS (* set the column values *) name := 'Fred'; ssn := 316768990;
(* insert new row *) retCd := SQLInsert('emp',name,ssn); IF (retCd < 0) THEN EXIT retCd; END;
END;
返回码 | 说明 |
1 | 成功完成 |
(其它) | 请参见 Tivoli 服务台 6.0 开发工具包脚本编程指南 |
SQLPrepare 准备以后执行的 SQL 命令字符串。此命令字符串一旦准备好,就称为准备的语句。如果 SQLPrepare 操作成功,则作为语句参数传递的变量将包含有效的语句句柄。
SQLPrepare(statement: SQLSTATEMENT, sqlCommand: STRING): INTEGER;
回退操作会自动关闭全部打开的(准备的)语句和游标。承诺操作会关闭全部打开的语句,该语句不引用用 WITH HOLD 声明的打开的游标(请参见 SQLCommit)。
自变量名称 | 说明 |
statement | 在接下来的 SQLExecute 语句中使用的语句句柄 |
sqlCommand | 这是完整的、语法正确的 SQL 语句 |
SQLPrepare 允许您准备几乎任何 SQL 命令,SELECT 命令和不能动态准备的命令除外。
如果在循环中多次执行一个命令(如 SQLDelete),则准备命令一次,然后用 SQLExecute 执行准备好的版本,比每次直接执行该命令要快一些。
注:可以使用 Tivoli 服务台开发工具包的内置字符串处理函数来帮助建立要准备的命令字符串。
Tivoli 服务台开发工具包不执行 SQLPrepare 中的限定扩展。但是,您仍然可以使用 $QUAL 和 $SYSQUAL。
KNOWLEDGEBASE Example;
--PUBLIC ROUTINES
FUNCTION Test(REF users: LIST OF STRING):INTEGER;
PRIVATE ROUTINES
FUNCTION Test(REF users: LIST OF STRING):INTEGER IS VARIABLES stmt: SQLStatement; retCd: INTEGER; ACTIONS SQLBeginWork; (* start a transaction *)
(* insert the user names passed in *) retCd := SQLPrepare(stmt,'INSERT INTO USERS VALUES (?)'); IF (retCd < 0) THEN SQLRollBack; (* terminate the transaction *) EXIT retCd; END;
FOR users DO retCd := SQLExecute(stmt,users[$current]); IF (retCd < 0) THEN SQLRollBack; (* reverse changes and release locks *) EXIT retCd; END; END; (* for *)
SQLCloseStatement(stmt); SQLCommit; (* accept changes and release locks *) END;
返回码 | 说明 |
1 | 成功完成 |
(其它) | 请参见 Tivoli 服务台 6.0 开发工具包脚本编程指南 |
有关其它信息,请参见 SQL 文档。
向 SQL 解释器发出 ROLLBACK WORK 命令,因此可以取消/恢复本事务进行期间所做的全部更改。
FUNCTION SQLRollBack: INTEGER;
注意:回退操作会导致自动关闭全部打开的游标和准备好的语句。
SQLRollBack 会终断当前的事务。如果要启动另一个事务,您必须再次调用 SQLBeginWork;否则 TSD 脚本重新开始自动承诺每个 SQL 语句。
使用 SQLRollBack 取消小型的、失败的、与用户输入无关的事务。避免对用户界面操作使用回退作为一般恢复。
KNOWLEDGEBASE Example;
--PUBLIC ROUTINES
FUNCTION Test(REF ssnList: LIST OF INTEGER):INTEGER;
PRIVATE ROUTINES
FUNCTION Test(REF ssnList: LIST OF INTEGER):INTEGER IS VARIABLES (* misc *) retCd: INTEGER; ACTIONS (* Start a logical transaction *) SQLBeginWork; (* delete all employees whose ssn is in the ssn list passed in *)
FOR ssnList DO retCd := SQLDelete('emp','ssn = ' & ssnList[$CURRENT]); IF retCd < 0 THEN SQLRollBack; (* reverse the changes and release locks *) EXIT retCd; END; END;
(* commit changes and release locks *) SQLCommit; END;
返回码 | 说明 |
1 | 成功完成 |
(其它) | 请参见 Tivoli 服务台 6.0 开发工具包脚本编程指南 |
基于指定的行打开游标,这些行是为以后用 SQLFetch 进行提取所指定的。
SQLSelect(cursor: SQLCURSOR, queryString: STRING [,expressionList...]): INTEGER;
任何时间打开的游标数都限定在 20 个之内。
回退操作将自动关闭全部游标。
大多数驱动程序不允许您指定可以跨越多个工作单元的游标 (例如,用 WITH HOLD 声明它们)。DB2 CLI 驱动程序是个例外。承诺操作之后将关闭全部游标。因此,如果在提取循环中执行 SQL 操作(如更新),您必须禁用在每个 SQL 语句之后的自动承诺。
注:在执行承诺和回退操作之前,应当关闭所有游标。
自变量名称 | 说明 |
cursor | 用于查询的游标句柄。 |
queryString | 这是选择字符串。它必须是完整的和语法正确的。 |
expressionList... | 这是零个或多个表达式的列表,每个表达式用逗号分开。例如: 3.4,age + 100,name,'Fred',$Sin(45),... |
如果您要更新或删除任何提取的行,您应当使用 FOR UPDATE OF 子句,以使 SQL 解释器明白您的意图。如果您以后要执行 SQLUpdateCurrent,这点是必需的。
如果您使用 SQLDeleteCurrent,这也是好的习惯。如果不使用 FOR UPDATE OF 子句,则按只读处理选择。
注:对于简单选择的字符串(如实例),SELECT 关键字是可选的。
SQLSelect 允许参数标记替换。要使用参数标记,请在语句字符串中插入问号 (?)。这作为以后替换值的占位符。此值从可选表达式列表中产生,该列表跟在语句字符串后面。表达式的数目必须与参数标记 (?) 的数目相匹配,并且表达式顺序也必须与标记的顺序相匹配。
Tivoli 服务台开发工具包不能用参数标记提供增强型检查。例如:
retCd = SQLSelect(cursor,'SELECT * FROM emp WHERE name = ?',name);
包含在变量名内的字符串不必使用单引号。您不需要使用变量。例如:
retCd = SQLSelect(cursor,'SELECT * FROM emp WHERE name = ?', 'Smith');
KNOWLEDGEBASE Example;
--PUBLIC ROUTINES
FUNCTION Test(REF age: INTEGER):INTEGER;
PRIVATE ROUTINES
FUNCTION Test(REF age: INTEGER):INTEGER IS VARIABLES (* columns *) name: STRING; (* misc *) cursor: SQLCursor; retCd: INTEGER; ACTIONS SQLBeginTran; (* start a transaction *)
(* select all employees from Indiana, and whose age is *) (* greater than the age passed into this function. *) retCd := SQLSelect(cursor,'SELECT name from emp WHERE (state = ''IN'') AND ' & '(age > ' & age & ') FOR UPDATE OF NAME'); IF (retCd < 0) THEN SQLRollBack; (* terminate the transaction *) EXIT retCd; END;
retCd := SQLFetch(cursor,name); WHILE (retCd > 0) DO (* possibly perform some operations based on "name" . . . *)
(* set name to uppercase *) name := StrUpper(name);
(* now update this row *) retCd := SQLUpdateCurrent(cursor,name); IF (retCd < 0) THEN SQLCloseCursor(cursor); SQLRollBack; (* reverse changes and release locks *) EXIT retCd; END;
(* get the next record *) retCd := SQLFetch(cursor); END;
SQLCloseCursor(cursor); SQLCommit; (* accept changes and release locks *) END;
返回码 | 说明 |
1 | 成功完成 |
(其它) | 请参见 Tivoli 服务台 6.0 开发工具包脚本编程指南 |
将指定行选取并提取到参数(列变量)内。
SQLSelectInto(queryString: STRING [,parameters...]): INTEGER;
自变量名称 | 说明 |
queryString | 这是选择字符串。它必须是完整的和语法正确的。 |
parameters | 这是用逗号分开的、零个或多个参数 (列变量) 的列表,这些参数的名称必须与对应的列名称匹配。 有关其它信息,请参见“注释”部分。 |
SQLSelectInto 等效于下列代码序列:
SQLSelect SQLFetch SQLCloseCursor.
因此,如果选择查询指定多行,则只提取第一行。
如果您要更新或删除任何提取的行,请使用 FOR UPDATE OF 子句,以使 SQL 解释器明白您的意图。如果不使用 FOR UPDATE OF 子句,则按只读处理选择。
参数名称必须与各自的列名称匹配。忽略其名称与列名称不匹配的任何参数。如果列名称以 SQLColumn_ 开始,以对应于选择列表中的位置的列编号结束,则为例外情况。用这种方法,您可以访问列(集合)函数的结果。
例如,如果您声明 SQLColumn_1 为变量(整数),则您可以用下列命令提取计数:
SQLSelectInto('SELECT count(*) from emp',$SQLColumn_1);
在参数列表内,$SQLColumn_xx 参数的顺序无关紧要。例如,如果名称是字符列,年龄是数字列,并且您声明 $SQLColumn_xx 变量为:
$SQLColumn_1: STRING; $SQLColumn_2: INTEGER;
然后下列命令将名称提取到 $SQLColumn_1, 将年龄提取到 $SQLColumn_2:
SQLSelectInto('name,age FROM emp',$SQLColumn_1,$SQLColumn_2);
下列命令也相同:
SQLSelectInto('name,age FROM emp',$SQLColumn_2,$SQLColumn_1);
对于简单的选择字符串,如实例,SELECT 关键字是可选的。您可以将记录作为参数传递,在这种情况下,字段名称必须与表的列名称匹配,否则将忽略它们。
如果您要传递同一类型的两个记录,SQLSelectInto 将填充它们。当使用被动并行时,这可以节省一步赋值操作。
KNOWLEDGEBASE Example;
--PUBLIC ROUTINES
FUNCTION Test:INTEGER;
PRIVATE ROUTINES
FUNCTION Test:INTEGER IS
VARIABLES (* columns *) name: STRING; ssn: INTEGER; age: INTEGER; (* misc *) retCd: INTEGER; ACTIONS (* select all employees from Indiana *) retCd := SQLSelectInto('SELECT * from emp WHERE state = ''IN''', name, age, ssn); IF (retCd < 0) THEN EXIT retCd; END;
END;
返回码 | 说明 |
1 | 成功完成 |
(其它) | 请参见 Tivoli 服务台 6.0 开发工具包脚本编程指南 |
设置配置或环境状态选项的值。
SQLSetOption(VAL option: STRING, VAL optionValue:<ANY SIMPLE VARIABLE> [,VAL srcOrConn : <INTEGER OR STRING EXPRESSION> ): INTEGER;
与 SQL 配置文件(sai_sql.cfg)中的选项不一样,传递给 SQLGetOption 的选项名称使用空格,而不是下划线作为分隔符。
不是 SQLGetOption 的全部选项都可以用 SQLSetOption 设置。有关有效选项的完整列表,以及是否可以用 SQLSetOption 更改它们的规则,请参见 SQLGetOption 的条目。
自变量名称 | 说明 |
option | 选项名称,如“DATE FORMAT” |
optionValue | 要设置的选项值。 |
srcOrConn | 此自变量是可选的,如果提供它,必须包括源名称 (STRING) 或连接句柄 (INTEGER)。如果不传递此参数,则假设为
$CURRENT。 注:与 SQLGetOption不一样,Tivoli
服务台开发人压工具包当前不支持此自变量,如果提供此自变量,则将其忽略。 |
此函数返回成功或错误代码。最常见的错误代码是:INVALID_OPTION 和 NOT_CONNECTED (对于那些需要您连接的选项,大多数都是这种情况)。
此函数包括以前在 SQLCommand('SET ... ') 中查找到的多数功能。通过调用 SQL 配置编辑器中的参数帮助,可以查找到每个参数(包括缺省值)的其它信息。除了一些例外情况,SQLGetOption 的参数可以用 SQLSetOption 设置。请参阅 SQLGetOption 获取可用选项的列表(这里也包括不能设置的选项)。
KNOWLEDGEBASE Example;
--PUBLIC ROUTINES
PROCEDURE Example;
PRIVATE ROUTINES PROCEDURE Example IS VARIABLES retCd: INTEGER; ACTIONS retCd := SQLSetOption('CASE CONVERSION', 2); END;
返回码 | 说明 |
1 | 成功完成 |
(其它) | 请参见 Tivoli 服务台 6.0 开发工具包脚本编程指南 |
用包含在参数(列变量)内的值更新指定的行。
SQLUpdate(tableName: STRING, queryString: STRING, parameters...] [,originalParameters...]): INTEGER;
注意:因为调用 SQLUpdate 一次可以更新许多行,所以仔细指定查询条件是很重要的。
自变量名称 | 说明 |
tableName | 要更新的表或视图的名称。 |
queryString | where 语句。 |
parameter | 这是用逗号分开的、零个或多个参数(列变量)的列表,这些参数的名称必须与对应的列名称匹配。 有关其它信息,请参见此语句的“注释”。 |
originalParameters | 这是参数的可选设置,该参数与第一次设置的一样。这些参数用于被动并行检查。 有关其它信息,请参见此语句的“注释”。 |
查询字符串中的 WHERE 关键字是可选的。传递到 SQLUpdate 的参数(列变量)必须具有与表的实际列一样的名称。如果参数名称与任何列名称不匹配,则忽略此参数。
请不要试图更新用 NOT NULL 选项创建的带有 $Unknown 的 Tivoli 服务台开发工具包参数表的列。您可以将记录作为参数传递,在这种情况下,字段名称必须与表的列名称匹配,否则将忽略它们。
Tivoli 服务台开发工具包为一些称为被动并行的并行机制提供内置支持。被动并行是一种简单但有力的方法,允许多个用户访问表,而不锁定表。之所以称为被动,是因为在正常访问记录的过程中实际上没有应用锁定。
被动并行按下列方法工作:
注:如果只传递一个记录,则 SQLUpdate 不执行任何被动并行检查。
您不一定要使用记录作为参数。如果使用被动并行,您应当确保两组参数的顺序要相同。
请不要试图更新用 NOT NULL 选项创建的带有 $Unknown Tivoli 服务台开发工具包参数的表的列。
KNOWLEDGEBASE Example; (* This example shows an update without passive concurrency. *)
--PUBLIC ROUTINES
FUNCTION Test:INTEGER;
PRIVATE ROUTINES
FUNCTION Test:INTEGER IS VARIABLES (* table columns *) age: INTEGER; (* misc *) retCd: INTEGER; ACTIONS age := 29;
(* Set all female employee's ages to 29 if they are 30 or over *) retCd := SQLUpdate('emp','age > 29',age); IF (retCd < 0) THEN EXIT retCd; END;
END;
返回码 | 说明 |
1 | 成功完成 |
(其它) | 请参见 Tivoli 服务台 6.0 开发工具包脚本编程指南 |
用参数(列变量)内的值更新游标的当前位置行。
SQLUpdateCurrent(cursor: SQLCURSOR, parameters): INTEGER;
自变量名称 | 说明 |
cursor | 游标必须是以前调用 SQLSelect 已经打开的游标。 |
parameters | 这是用逗号分开的、一个或多个参数(列变量)的列表,这些参数的名称必须与对应的列名称匹配。 有关的详细信息,请参见“注释”部分。 |
SQLUpdateCurrent。必须在选择字符串(请参见 SQLSelect) 中的 FOR UPDATE OF 子句中,指定要更新的每一列。
传递到 SQLUpdateCurrent 的参数(列变量),必须具有与表的实际列一样的名称。如果参数名称与任何列名称不匹配,则忽略此参数。您可以把记录作为参数传递。在这种情况下,字段名称必须与表的列名称匹配,否则将忽略它们。
注:在更新的每一列,必须使用 FOR UPDATE OF... 子句。
请不要试图更新用 NOT NULL 选项创建的带有 $Unknown Tivoli 服务台开发工具包参数的表的列。
KNOWLEDGEBASE Example;
--PUBLIC ROUTINES
FUNCTION Test(REF age: INTEGER):INTEGER;
PRIVATE ROUTINES
FUNCTION Test(REF age: INTEGER):INTEGER IS VARIABLES (* columns *) name: STRING; (* misc *) cursor: SQLCursor; retCd: INTEGER; ACTIONS SQLBeginWork; (* start a transaction *)
(* select all employees from Indiana, and whose age is greater *) (* than the age passed into this function. *) retCd := SQLSelect(cursor,'name from emp WHERE (state = ''IN'') AND ' & '(age > ' & age & ') FOR UPDATE OF NAME'); IF (retCd < 0) THEN SQLRollBack; (* must terminate the transaction *) EXIT retCd; END;
retCd := SQLFetch(cursor,name); WHILE (retCd > 0) DO (* possibly perform some operations based on "name" . . . *)
(* set name to uppercase *) name := StrUpper(name);
(* now update this row *) retCd := SQLUpdateCurrent(cursor,name); IF (retCd < 0) THEN SQLCloseCursor(cursor); SQLRollback; (* reverse any changes, and release locks *) EXIT retCd; END;
(* get the next record *) retCd := SQLFetch(cursor); END;
SQLCloseCursor(cursor); SQLCommit; (* commit changes and release locks *) END;
返回码 | 说明 |
1 | 成功完成 |
(其它) | 请参见 Tivoli 服务台开发工具包 6.0 开发工具包脚本编程指南 |
Tivoli 服务台 6.0 开发工具包脚本语言参考