db2写存储过程用什么工具(如何执行db2存储过程)
一、在DB2中怎样根据身份证号用存储过程计算出生日期
1、存储过程编写
DROP PROCEDURE"PLName"
@
CREATE PROCEDURE"PLName"(--存储过程名字
IN IN_ID BIGINT,--以下全是输入参数
IN IN_ENTNAME VARCHAR(200),
IN IN_REGNO VARCHAR(50),
IN IN_PASSWORD VARCHAR(20),
IN IN_LEREP VARCHAR(300),
IN IN_CERTYPE CHARACTER(1),
IN IN_CERNO VARCHAR(50),
IN IN_LINKMAN VARCHAR(50),
IN IN_SEX CHARACTER(1),
IN IN_MOBTEL VARCHAR(30),
IN IN_REQDATE TIMESTAMP,
IN IN_REMITEM VARCHAR(300),
IN IN_STATE CHARACTER(1),
IN IN_TIMESTAMP TIMESTAMP
)
BEGIN
declare V_RESULT BIGINT;--声明变量
DELETE FROM TableNameA WHERE ID= IN_ID;
SET V_RESULT= NULL;--为变量赋值
--检查用户输入的信息是否合法
select b.id INTO V_RESULT from TableNameB b,TableNameC c where正常的判断条件
if(V_RESULT IS NOT NULL) then---如果合法,执行下面的insert语句
INSERT INTO TableNameA(ID,ENTNAME,REGNO,PASSWORD,LEREP,CERTYPE,CERNO,LINKMAN,SEX,MOBTEL,REQDATE,REMITEM,STATE,TIMESTAMP)
VALUES(IN_ID,IN_ENTNAME,IN_REGNO,IN_PASSWORD,IN_LEREP,IN_CERTYPE,IN_CERNO,IN_LINKMAN,IN_SEX,IN_MOBTEL,IN_REQDATE,IN_REMITEM,IN_STATE,IN_TIMESTAMP);
end if;
commit;
END
@
2、调用存储过程
1.拷贝到DB2客户端工具中直接执行
2.将上面的语句保存为test.db2文件放到任意目录下(比如D盘根目录),然后在cmd输入db2cmd然后输入db2-td@-vf D:\test.db2即可
3.直接写sql:
call PLName(存储过程名字)(IN_ID,IN_ENTNAME,IN_REGNO,IN_PASSWORD,IN_LEREP,IN_CERTYPE,IN_CERNO,IN_LINKMAN,IN_SEX,IN_MOBTEL,IN_REQDATE,IN_REMITEM,IN_STATE,IN_TIMESTAMP对应的值)
二、如何执行db2存储过程
1、db2 create database数据库名<--创建数据库
2、db2 connect to数据库名 user用户名 using用户密码<--连接数据库
3、db2-tvf otpdb_v3_db2.sql<--为新建数据库建立表结构
4、db2-td@-f存储过程文件绝对路径<--导入存储过程,无错误会提示成功
4、调用存储过程:
Windows下:db2 call存储过程名(参数1,参数2)
AIX下:db2<--要先进入DB2,方可调用存储过程或执行SQL语句
db2=>call存储过程名(参数1,参数2)
5、验证插入数据是否成功
Windows下:db2 select count(*) from FTOTP_USERINFO
AIX下:db2<--要先进入DB2,方可调用存储过程或执行SQL语句
db2=>select count(*) from FTOTP_USERINFO
Windows下:db2 select count(*) from FTOTP_TOKENINFO
AIX下:db2<--要先进入DB2,方可调用存储过程或执行SQL语句
db2=>select count(*) from FTOTP_TOKENINFO
三、如何在DB2中执行存储过程
1、db2 create database数据库名<--创建数据库
2、db2 connect to数据库名 user用户名 using用户密码<--连接数据库
3、db2-tvf otpdb_v3_db2.sql<--为新建数据库建立表结构
4、db2-td@-f存储过程文件绝对路径<--导入存储过程,无错误会提示成功
4、调用存储过程:
Windows下:db2 call存储过程名(参数1,参数2)
AIX下:db2<--要先进入DB2,方可调用存储过程或执行SQL语句
db2=>call存储过程名(参数1,参数2)
5、验证插入数据是否成功
Windows下:db2 select count(*) from FTOTP_USERINFO
AIX下:db2<--要先进入DB2,方可调用存储过程或执行SQL语句
db2=>select count(*) from FTOTP_USERINFO
Windows下:db2 select count(*) from FTOTP_TOKENINFO
AIX下:db2<--要先进入DB2,方可调用存储过程或执行SQL语句
db2=>select count(*) from FTOTP_TOKENINFO
6、db2 SELECT TOKEN, PUBKEY FROM FTOTP_TOKENINFO FETCH FIRST 10000 ROWS ONLY>要保存文件的绝对全路径<--从 DB2中导出前一万条记录
windows- e.g. db2 SELECT TOKEN, PUBKEY FROM FTOTP_TOKENINFO FETCH FIRST 10000 ROWS ONLY> c:\abc.txt
AIX- e.g. db2 SELECT TOKEN, PUBKEY FROM FTOTP_TOKENINFO FETCH FIRST 10000 ROWS ONLY> c:\abc.txt<--注意:不能先进入DB2,执行查询与导出命令组合
7、db2 drop procedure存储过程名<--删除存储过程
8、db2 drop database数据库名<--删除指定名称的数据库
注,如果删除时提示有应用程序连接到这个数据库上,可以用如下命令断开所有应用程序的连接:
db2 force application all<--断开所有应用程序的连接
四、db2创建存储过程在begin和end中间有东西就报错是什么情况
因为在 Unix平台下的 DB2存储过程对于实例用户和受防护用户之间的关系有一个约束,即 DB2实例用户必须同时是受防护用户的主组中的一个用户。
上述问题的发生就是由于在系统上,实例用户未加入至受防护用户的主组中,从而引发了存取权限不够的问题所导致的,而并非真的发生了如日志中所报的磁盘错误。解决这一问题的方法很简单,只要将实例用户加入该主组即可。
但有时用户会发现,即使已将用户加入到指定组,问题仍然存在,这时还应检查一下实例用户所加入的组是否是实例用户所对应的受防护用户的主组,即检查一下加入的组是否正确。
要找到实例用户所应的受防护用户以及受防护用户的主组,可用如下方法:
转入实例用户 Home路径下的 sqllib/adm路径。
执行命令:ls-l.fenced,会得到类似如下输出。
r--r--r-- 1 db2fencj db2fgrp2 0 Jul 30 09:57.fenced。
输出中表明,该文件所属的用户(db2fencj)即为受防护用户,所属的组(db2fgrp2)即为受防护用户的主组
继而,用户便可验证实例用户是否被加入到了正确的组中,如果结果正确,便可以解决上述问题。