返回首页

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

更新日期:2024年09月11日

BackUp table vcname000001.test.t1 end

使用 SYSTEM 语句从 SPL 例程中发出操作系统命令。
语法

元素
描述
限制
语法
expression
对用户可执行操作系统命
令求值
不能指定该命令在后台
运行
操作系统从

SPL_var
包含命令的 SPL 变量
必须是字符数据类型
标识符;

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1240
用法
如果指定的 expression 不是字符表达式,则它被转换为字符表达式并传递到操作
系统以进行执行。
SYSTEM 指定的命令不能在后台运行。数据库服务器在继续 SPL 例程中的下一
语句之前等待操作系统完成该命令的执行。SPL 例程不能使用任何从该命令返回
的值。
如果操作系统命令失败(即,返回命令的非零状态),则出现异常。该异常包含
返回的操作系统状态作为 ISAM 错误代码和相应的 SQL 错误代码。
回滚不终止系统调用,这样暂挂的事务可以无限等待调用以返回。有关在长事务
回滚期间从死锁恢复的指示信息,请参阅 GBase 8s 管理员指南。
GBase 8s 的动态日志功能自动添加日志文件,直到长事务成功完成或回滚。
在包含 SYSTEM 语句的 DBA 和所有者特权的 SPL 例程中,该命令经执行例
程的用户的许可方可运行。
在 UNIX 上执行 SYSTEM 语句
在 UNIX™ 平台的 SPL 过程中,评估为有效 UNIX 操作系统命令的规范必须紧
跟在 SYSTEM 关键字之后。
这两个程序片段使用 SPL 的 SYSTEM 语句向系统管理员发送消息:

在第一个示例中,sensitive_update 例程定义名为 mailcall 的 SPL 变量
存储指定 mail 实用程序名称,邮件的收件人的用户 ID 和邮件文本的字
符串。

在第二个示例中,sensitive_update2 例程类似地使用 SYSTEM 语句调用
mail 实用程序。表达式通过连接三个带引号的字符串和 SPL 变量 user1
和 user2 来构造有效的命令行,以向系统管理员发送一个名为
violations_file 的文件。
使用 SYSTEM 语句发送邮件
在 SPL 例程的以下示例中的 SYSTEM 语句可使 UNIX 操作系统将邮件消息发
送给系统管理员,他的用户 ID 是 headhoncho:
CREATE PROCEDURE sensitive_update()
...

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1241
LET mailcall = 'mail headhoncho < alert';
-- code to execute if user tries to execute a specified
-- command, then sends email to system administrator
SYSTEM mailcall;
...
END PROCEDURE; -- sensitive_update
可以使用双竖线符号(||)将表达式与 SYSTEM 语句连接起来,如以下示例中
所示:
CREATE PROCEDURE sensitive_update2()
DEFINE user1 char(15);
DEFINE user2 char(15);
LET user1 = 'joe';
LET user2 = 'mary';
...
-- code to execute if user tries to execute a specified
-- command, then sends email to system administrator
SYSTEM 'mail -s violation' || user1 || ' ' || user2|| '< violation_file';
...
END PROCEDURE; --sensitive_update2
在以上两个示例中,空格分隔命令行的元素,因此 SYSTEM 关键字后面的表达
式计算为符合操作系统 mail 实用程序的语法要求的字符串。
在 Windows 上执行 SYSTEM 语句
在 Windows™ 系统中,只有当正在执行 SPL 例程的当前用户已经用密码登录
后,才能在 SPL 例程中执行任何 SYSTEM 语句。
数据库服务器必须拥有用户的密码和登录名以代表该用户的执行命令。
以下 SPL 例程示例中的第一个 SYSTEM 语句可使 Windows 将错误消息发送给临
时文件并将消息放入按字母排序的系统日志中。第二个 SYSTEM 语句导致操作系
统删除临时文件:
CREATE PROCEDURE test_proc()
...
SYSTEM 'type errormess101 > %tmp%tmpfile.txt |
sort >> %SystemRoot%systemlog.txt';
SYSTEM 'del %tmp%tmpfile.txt';

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1242
...
END PROCEDURE; --test_proc
在此示例中跟随 SYSTEM 语句的表达式包含由 Windows 定义的变量 %tmp%
和 %SystemRoot%。
在 SYSTEM 命令中设置环境变量
当执行 SYSTEM 指定的操作系统命令时,不存在任何用户应用程序设置的环境
变量被传递到操作系统的保证。如果在 SYSTEM 命令中设置环境变量,则该设
置仅在该 SYSTEM 命令期间有效。
要避免此潜在问题,建议使用以下方法确保用户应用程序要求的任何环境变量被
转发到操作系统。
更改操作系统命令的环境设置:
1. 创建将会设置希望环境的 shell 脚本(在 UNIX™ 系统上)或 batch 文
件(在 Windows™ 平台上),然后执行操作系统命令。
2. 使用 SYSTEM 命令执行 shell 脚本或 batch 文件。
此解决方案还有其它优势:如果您以后需要更改环境,可以修改 shell 脚本或
batch 文件,而不需重新编译 SPL 例程。
有关设置环境变量的操作系统命令的信息,请参阅 GBase 8s SQL 参考指南。

字符串是多个字符组成的一个字符序列,由单引号“'”或双引号“"”字符包围。
例如:'a string'。
在一个字符串中,确定的序列具有特殊的含义,每个序列以反斜线符号“\”开头,
称为转义字符。GBase UP 识别下列转义字符:
表 5-118 字符串类型
转义字符
描 述
\0
ASCII 0 (NUL)字符。
\'
ASCII 39 单引号“'”字符。
\"
ASCII 34 双引号“"”字符。
\b
ASCII 8 退格符。
\n
ASCII 10 换行符。
\r
ASCII 13 回车符。
\t
ASCII 9 制表符(TAB)。
\\
ASCII 92 反斜线“\”字符。
这些符号是大小写敏感的。例如:“\b”被解释为一个退格,但是“\B”被解释为
“B”。
在其它的所有转义字符中,忽略反斜线符号。换句话说,反斜线用来解释转义字符
而不是被转义。
当字符串中包含引号时:
字符串用单引号“'”来引用的,该字符串中的单引号“'”字符可以用“''”方式转
义。
用户也可以继续使用在引号前加一个转义字符“\”的方式进行转义。
字符串是用单引号“'”来引用的,该字符串中的双引号“"”不需要特殊对待而且
不必被重复或转义。
下面的示例说明了SELECT 语句对引号和转义是如何工作的。

示例1:使用单引号“'”,双引号“"”,转义字符“\”包围字符串。

GBase UP 产品手册 5 数据库管理指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 358
gbase> SELECT 'hello', '"hello"', '""hello""', 'hel''lo', '\'hello' FROM t;
+-------+---------+-----------+--------+--------+
| hello | "hello" | ""hello"" | hel'lo | 'hello |
+-------+---------+-----------+--------+--------+
| hello | "hello" | ""hello"" | hel'lo | 'hello |
+-------+---------+-----------+--------+--------+
1 row in set

示例2:字符串中存在转义字符“\”。
gbase> SELECT 'This\nIs\nFour\nLines' FROM t;
+--------------------+
| This
Is
Four
Lines |
+--------------------+
| This
Is
Four
Lines |
+--------------------+
1 row in set

示例3:不存在转义含义时,忽略反斜线符号。
gbase> SELECT 'disappearing\ backslash' FROM t;
+------------------------+
| disappearing backslash |
+------------------------+
| disappearing backslash |
+------------------------+
1 row in set
如果用户想要把二进制数据插入到BLOB 字段中,
下列字符必须由转义序列表
示:
表 5-119 字符串类型
字 符
描 述
NUL
NUL
byte
(ASCII
0)

需要用
“\0”
(一个反斜线和一个ASCII
“0”字符)表示。
\
反斜线(ASCII 92)。需要用“\\”表示。
'
单引号(ASCII 39)。需要用“\'”表示。
"
双引号(ASCII 34)。需要用“\"”表示。

示例4:
创建的表中productBlob 字段的类型为BLOB,
插入的数据中存在转义
字符。

GBase UP 产品手册 5 数据库管理指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 359
gbase> DROP TABLE IF EXISTS products;
Query OK, 0 rows affected

gbase> CREATE TABLE products (productBlob BLOB);
Query OK, 0 rows affected

gbase> INSERT INTO products values('abdcdrf\\ghi\'jklm\"nopqrs\0tuvwxyz');
Query OK, 1 row affected

gbase> SELECT productBlob FROM products;
+---------------------------------+
| productBlob |
+---------------------------------+
| abdcdrf\ghi'jklm"nopqrs tuvwxyz |
+---------------------------------+
1 row in set
当写程序代码时,任何一个字符串都有可能包含这些特殊的字符,因此在这些
字符作为SQL 语句中的数据传到GBase UP 之前必须进行适当的转义。