返回首页

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

更新日期:2024年09月11日

当您希望保证循环的终止时,请使用 FOR 语句来初始化受控的(限定的)循
环。FOR 语句使用表达式或范围运算符来为循环指定有限数量的迭代。
语法

Range

元素
描述
限制
语法
expression
与 loop_var 相比较
的值
必须与 loop_var 数
据类型相匹配
表达式

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1206
元素
描述
限制
语法
increment_expr
loop_var 增加的正
值或负值。缺省为 1
(如果 left_expr <
right_expr),或者
-1 (如果
left_expr >
right_expr)
必须返回整数。不能
返回 0。
表达式
label
此循环的循环标签的
名称
必须存在且在 SPL
例程中的标签名中必
须是唯一的
标识符
left_expr
开始范围的表达式
值必须与 loop_var
的 SMALLINT 或 INT
数据类型相匹配,但
是 left_expr 不能
等于 right_expr
表达式
loop_var
确定指定循环次数的
变量
必须在该语句块的作
用域内定义
标识符
right_expr
范围中的结束表达式 同 left_expr
表达式
用法
数据库服务器在 FOR 语句执行之前计算所有表达式的值。如果其中一个或多个
表达式是其值在循环期间更改的变量,则该更改对循环的迭代没有影响。
您可以将来自 SELECT 语句的输出用作表达式。
当 loop_var 等于表达式列表或连接的范围中的每个元素的值,或当它遇到 EXIT
FOR 语句时,FOR 循环终止。但如果在 FOR 语句的主体中的赋值尝试修改
loop_var 值,会发生错误。
相对于 left_expr 的 right_expr 大小确定该范围是否按照正增量或负增量单步
遍历:

如果 left_expr < right_expr ,则增量为正。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1207

如果 left_expr > right_expr ,则增量为负。
如果未指定 increment_expr,则每一步的缺省大小为 1,由以上的规则决定是正
或负。
使用 TO 关键字定义范围
TO 关键字表示范围运算符。范围由 left_expression 和 right_expression 定义,
并且 STEP increment_expr 选项隐式地设置增量数。如果使用 TO 关键字,
loop_var 必须是 INT 或 SMALLINT 数据类型。
以下示例显示了两个等同的 FOR 语句。每个语句使用 TO 关键字定义范围。第一
个语句使用 IN 关键字,第二个语句使用等号( = )。每个语句使循环执行五
次:
FOR index_var IN (12 TO 21 STEP 2)
-- statement block
END FOR;
FOR index_var = 12 TO 21 STEP 2
-- statement block
END FOR;
如果省略 STEP 选项,则数据库服务器给予 increment_expr 的值为 -1 (如果
right_expression 小于 left_expression),或 +1 (如果 right_expression 大于
left_expression)。如果指定了 increment_expr ,则它必须为负数(如果
right_expression 小于 left_expression)或者正数(如果 right expression 大于
left_expression)。
以下示例中的两个语句是等价的。在第一个语句中,STEP 增量是显式的。在第二
个语句中,STEP 增量隐式地为 1:
FOR index IN (12 TO 21 STEP 1)
-- statement block
END FOR;
FOR index = 12 TO 21
-- statement block
END FOR;
数据库服务器将 loop_var 的值参数为 left_expression 的值。在后续迭代中,服
务器将 increment_expr 添加到 loop_var 的值并检查 increment_expr 以确定

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1208
loop_var 值是否仍在 left_expression 和 right_expression 之间。如果这样,会发
生下一迭代。否则,会发生循环退出。或者,如果指定另一范围,变量会具有下
一范围中的第一个元素的值。
在单个 FOR 语句中指定两个或更多的范围
以下示例显示向前或向后遍历循环并在每一方向使用不同增量值的语句:
FOR index_var IN (15 to 21 STEP 2, 21 to 15 STEP -3)
-- statement body
END FOR;
将表达式列表作为范围使用
数据库服务器将 loop_var 的值初始化为指定的第一个表达式的值。在后续的迭代
中,loop_var 值取决于下一个表达式的值。当数据库服务器已计算了列表中的最
后一个表达式的值并使用了它时,循环停止。
IN 列表中的表达式无须是数值,只要不在 IN 列表中使用范围运算符。以下示例
使用字符表达式列表:
FOR c IN ('hello', (SELECT name FROM t), 'world', v1, v2)
INSERT INTO t VALUES (c);
END FOR;
以下 FOR 语句显示了数值表达式列表的使用:
FOR index IN (15,16,17,18,19,20,21)
-- statement block
END FOR;
在同一 FOR 语句中混合范围和表达式列表
如果 loop_var 是 INT 或 SMALLINT 值,您可以在同一 FOR 语句中混合范围
和表达式列表。以下示例显示使用整数变量的混合。表达式列表中的值包括从
SELECT 语句返回的值、整数变量和常量的和、从名为 p_get_int 的 SPL 函数
返回的值和整数变量:
CREATE PROCEDURE for_ex ()
DEFINE i, j INT;
LET j = 10;
FOR i IN (1 TO 20, (SELECT c1 FROM tab WHERE id = 1),

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1209
j+20 to j-20, p_get_int(99),98,90 to 80 step -2)
INSERT INTO tab VALUES (i);
END FOR;
END PROCEDURE;
指定已标记的FOR 循环
要创建已标记的 FOR 循环,在最初的 FOR 关键字之前声明循环标签,在 END
FOR 关键字之后重复此标签,如下所示:
CREATE PROCEDURE ex_cont_ex()
DEFINE i,s,j, INT;
<>
FOR j = 1 TO 20
IF j > 10 THEN
CONTINUE FOR;
END IF
LET i,s = j,0;
WHILE i > 0
LET i = i -1;
IF i = 5 THEN
EXIT for_lab;
END IF
END WHILE
END FOR for_lab
END PROCEDURE;

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1210
这里 EXIT for_lab 语句具有与 EXIT 或 EXIT FOR 关键字相同的作用,都
终止了 FOR 循环和例程。在此示例中,包含 EXIT for_lab 语句的语句具有
与 EXIT for_lab WHEN i = 5 相同的效果。
您还可以标记紧跟在初始 FOR 关键字之前的循环 <

(1 row)

log(b numeric, x numeric)

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

描述:以b 为底的对数。
返回值类型:numeric
示例:
gbase=# SELECT log(2.0, 64.0);
log
--------------------

以下是 onparams 命令的示例:
onparams -a -d rootdbs -s 1000 # adds a 1000-KB log file to rootdbs
onparams -a -d rootdbs -i # inserts the log file after the current log
onparams -d -l 7 # drops log 7
onparams -p -d dbspace1 -s 3000 # resizes and moves physical-log to dbspace1

GBase 8s 管理员参考
南大通用数据技术股份有限公司 - 386 -
onparams -b -g 6 -n 3000 -r 2 -x 2.0 -m 1.0 # adds 3000 buffers of size
6K bytes each with 2 LRUS with maximum dirty of 2% and minimum dirty of 1%