DB2 v7.2 中的高级 SQL 过程脚本编制
2008-09-09 16:30:15 来源:WEB开发网UNIX Windows
db2 connect to <dbname>
db2 -td@ -f procparam.ddl
db2 call getText($1)
db2 drop procedure getText (INT)
db2 connect to <dbname>
db2 -td@ -f procparam.ddl
db2 call getText(%1)
db2 drop procedure getText (INT)
然后,为了执行这个脚本,请完成:
chmod +x procparam.cm (仅 UNIX 需要)
procparam.cmd 1
额外技巧
本节包含一些我觉得非常有用的技巧:
时间戳记和其它特殊寄存器
UDF 及脚本中的游标
时间戳记和其它特殊寄存器
查看下面的脚本。您希望发生什么?
BEGIN ATOMIC
Insert into HELLO values (char (current timestamp));
Insert into HELLO values (char (current timestamp));
END
乍一看,您可能希望在 Hello 表中插入两个稍有不同的时间戳记值。然而,如果执行它,那么您会发现同一个时间戳记值插入了两次。发生这种情况是因为实际上 ATOMIC 复合 SQL 语句是作为一个 SQL 语句执行的一组 SQL 语句。因此,要小心使用日期和时间寄存器。
当 BEGIN ATOMIC 是这个行为定义的一部分时,该行为也适用于 SQL UDF。这种行为不适用于 SQL 存储过程,除非在同一个 BEGIN ATOMIC 节中包含了 SQL 语句。
如果您需要生成唯一的时间戳记,将 GENERATE_UNIQUE() 函数与时间戳记一起使用。例如:
BEGIN ATOMIC
insert into HELLO
values (char(timestamp(generate_unique()) + current timezone));
insert into HELLO
values (char(timestamp(generate_unique()) + current timezone));
END
UDF 及脚本中的游标
目前还不支持可更新的游标。如果您需要在脚本中使用游标,那么可以使用 FOR LOOP 构造(它的功能与只读游标类似),并在循环内使用 UPDATE 语句。例如:
BEGIN ATOMIC
FOR cur1 AS SELECT c1, c2, c3 from mytable
IF cur1.c1 = 1 THEN
INSERT INTO sometable1 values (cur1.c2, cur1.c3);
ELSE
UPDATE sometable1 SET somecol=cur1.c2;
END IF;
END@
结束语
我们已经了解了如何利用 DB2 的增强脚本编制功能。脚本编制有助于自动执行任务、测试和使简单方案快速原型化。我们知道了如何编写包含 SQL 过程语言元素的脚本、如何将脚本的输出假脱机存储到一个日志文件以及如何通过使用 UDF 和 SQL 存储过程在脚本中处理参数。
- ››sql server自动生成批量执行SQL脚本的批处理
- ››sql server 2008亿万数据性能优化
- ››SQL Server 2008清空数据库日志方法
- ››sqlserver安装和简单的使用
- ››SQL Sever 2008 R2 数据库管理
- ››SQL SERVER无法安装成功,sqlstp.log文件提示[未发...
- ››Sql Server中通过父记录查找出所有关联的子记录
- ››SqlServer触发器、存储过程和函数
- ››SQL Server 中的事务(含义,属性,管理)
- ››Sqlite数据库插入和读取图片数据
- ››Sql server 2005拒绝了对对象 'xx表' (数...
- ››Sql server 2005拒绝了对对象 'xx表' (数...
更多精彩
赞助商链接