db2存储过程之动态SQL

该博客介绍了如何在DB2中创建一个名为`validate`的存储过程,该过程使用动态SQL来遍历指定条件的表,并统计每张表的记录数。存储过程首先创建一个临时表SESSION.TMP存储表名和计数,然后通过游标循环处理syscat.tables中的表,准备并执行动态SQL获取每张表的行数,更新到临时表中。最后,将结果导出到CSV文件。
摘要由CSDN通过智能技术生成
    最近job调度平台的项目要核对数据,需要编写一个存储过程来获取生产库上相关表的总记录条数,
通过与测试库上的数据条数进行对比来进行大致的核对。由于我之前没写过DB2的过程,所以写起来
比较费劲,不过最终还是完成了。
    具体是这样的:我们先通过SQL在生产上查找出与项目相关的表,在存储过程中声明一个临时表来
存放这些表名,并用另一个字段来存储各表的记录条数;
    然后,声明一个游标来获取所有的表名(这里游标不要从临时表里来获取数据,在临时表声明前就
要声明游标,游标数据同临时表一样通过SQL来获取);
    接着就是通过游标来生成动态的SQL。 在DB2中动态SQL中包含SELECT或者VALUES是不能够直接执行
,这也是一直困扰我的地方。在网上看了好多相关的资料,经过多次尝试,最终找到了解决办法。
要执行包含SELECT或者VALUES的动态SQL 语句,要做以下几步:
1.声明一个存放动态SQL的变量 v_sql
2.声明一个statement类型的变量 v_stmt
3.为statement变量声明一个游标 c2
4.写好动态SQL语句 set v_sql='select count(*) from dbo.'||v_1;--(v_1为表名)
5.prepare v_stmt from v_sql
6.打开游标c2,fetch c2  into v_count; 关闭游标
  
    最后用v_count的值来更新临时表,进行数据导出;
    call sysproc.admin_cmd('export to /home/db2inst1/validate/validate.csv of del select * from session.tmp');
     导出数据时,我想直接导出到本地,刚一开始就写了个本地的路径,结果报错了,后来才知道要一个远程服务器
的路径才可以,并且用户要有写入的权限。


完整的代码如下:

点击(此处)折叠或打开

  1. drop procedure dbo.validate ();
  2. create procedure dbo.validate ()
  3. language sql
  4. begin
  5.     DECLARE SQLCODE INT DEFAULT 0;
  6.     DECLARE v_1 VARCHAR(40);
  7.     DECLARE v_sql VARCHAR(1000
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值