DB2存储过程语法语法:CREATE PROCEDURE <schema-name>.<procedure-name> (参数) [属性] <语句>--参数:SQL PL 存储过程中有三种类型的参数:IN:输入参数(默认值,也可以不指定)OUT:输出参数INOUT:输入和输出参数--属性1、LANGUAGE SQL指定存储过程使用的语言。
LANGUAGE SQL 是其默认值。
还有其它的语言供选择,比如Java 或者C,可以将这一属性值分别设置为LANGUAGE JAVA 或者LANGUAGE C。
2、DYNAMIC RESULT SETS <n>如果您的存储过程将返回n 个结果集,那么需要填写这一选项。
3、SPECIFIC my_unique_name赋给存储过程一个唯一名称,如果不指定,系统将生成一个惟一的名称。
一个存储过程是可以被重载的,也就是说许多个不同的存储过程可以使用同一个名字,但这些存储过程所包含的参数数量不同。
通过使用SPECIFIC 关键字,您可以给每一个存储过程起一个唯一的名字,这可以使得我们对于存储过程的管理更加容易。
例如,要使用SPECIFIC 关键字来删除一个存储过程,您可以运行这样的命令:DROP SPECIFIC PROCEDURE。
如果没有使用SPECIFIC 这个关键字,您将不得不使用DROP PROCEDURE 命令,并且指明存储过程的名字及其参数,这样DB2 才能知道哪个被重载的存储过程是您想删除的。
4、SQL 访问级别NO SQL:存储过程中不能有SQL 语句CONTAINS SQL:存储过程中不能有可以修改或读数据的SQL 语句READS SQL:存储过程中不能有可以修改数据的SQL 语句MODIFIES SQL:存储过程中的SQL 语句既可以修改数据,也可以读数据默认值是MODIFIES SQL,一个存储过程不能调用具有更高SQL 数据访问级别的其他存储过程。
例如,被定义为CONTAINS SQL 的存储过程可以调用被定义为CONTAINS SQL 或NO SQL 的存储过程。
但是这个存储过程不能调用被定义为READS SQL DATA 或MODIFIES SQL 的其他存储过程。
--语句可以是一条单独的语句或者是一组由BEGIN [ATOMIC] ... END 复合语句DB2数据库动态SQL应用今天写了一个db2的存储过程,分享一下:动态SQL的应用介绍DB2存储过程中,三种操作的动态SQL的应用动态表名DECLARE db_tbname VARCHAR(50);//定义动态表名变量SET db_tbname = ‘’||’’;//给动态表名变量赋值,||是连接符,相当于java中的+号DECLARE db_sqlstr VARCHAR(1024);//定义动态SQL变量//准备动态插入SQL的拼装SET db_sqlstr = ‘INSERT INTO ’||db_tbname||’(name,age)VALUES(?,?)’;//预定义两个问号PREPARE s2 FROM db_sqlstr;//给问号赋值并执行SQLEXECUTE s2 USING name,age;查询SQL的拼装及执行SET db_sqlstr =' set (?,?) = (SELECT name,age FROM table where pid=?)’;PREPARE s1 FROM db_sqlstr;EXECUTE s1 INTO out_name,out_ageUSING pid;Set(?,?) 这段的解释是: SELECT name,age 将以预定义的方式,输出到某个字段中去,下一句EXECUTE s1 INTO out_name,out_age则是承上的,也就是查出来的name和age,将赋值给out_name和out_age;USING pid ,则是查询语句中,where条件;DB2 存储过程批量插入数据存储过程CREATE OR REPLACE PROCEDURE "CSSSUPRD"."TEST_ADD_DATA"()LANGUAGE SQLSPECIFIC SQL130327103544500BEGINDECLARE v_casekey INT;DECLARE v_fpn INT;DECLARE v_seqNum INT;DECLARE I INT default 0;SET v_casekey=755;SET v_fpn=1;SET v_seqNum=1;WHILE I<32000 DOIF mod(I,2) = 0 THENinsert into table.Avalues (v_casekey, v_fpn, 'F', v_seqNum);ELSEinsert intotable.A values (v_casekey, v_fpn, 'F', v_seqNum);--END;END IF;SET v_seqNum=v_seqNum+1;SET I=I+1;END WHILE;END#db2db2中的case语句两种语法模式:(1):CASEWHEN 条件 THEN 结果1ELSE 结果2END(2):CASE 表达式1WHEN 表达式2 THEN 结果1ELSE 结果2END上面的WHEN可以重复多次,就像C中的SWITCH ..CASE的表达下面详细的各举几个例子,这些例子可以用于ESQL和交互式的SQL中eg1:处理被0除SELECTCASEWHEN fileld1=0 THEN 0ELSE fileld2/field1ENDFROM FILEeg2:字段值对应转换SELECT ORDNO,CUSNAM,SHIPDATE,CASEWHEN SHIPDATE<CURDATE() THEN 'OVERDUE'WHEN SHIPDATE=CURDATE() THEN 'PROCESSING'WHEN SHIPDATE>CURDATE() THEN 'ACTIVE'ENDFROM FILEeg3:获取月份的名字:上面的例子SELECT ORDNO,CUSNO,CASE MONTH(SHIPDATE)WHEN '01' THEN 'Jan'WHEN '02' THEN 'Feb'WHEN '03' THEN 'Mar'WHEN '04' THEN 'Apr'WHEN '05' THEN 'May'WHEN '06' THEN 'Jun'WHEN '07' THEN 'Jul'WHEN '08' THEN 'Aug'WHEN '09' THEN 'Sep'WHEN '10' THEN 'Oct'WHEN '11' THEN 'Nov'WHEN '12' THEN 'Dec'ENDFROM FILEdb2命令大全1. 建立数据库DB2_GCBCREATE DATABASE DB2_GCB ON G: ALIAS DB2_GCBUSING CODESET GBK TERRITORY CN COLLATE USING SYSTEM DFT_EXTENT_SZ 32 2. 连接数据库connect to sample1 user db2admin using 83012063. 建立别名create alias db2admin.tables for sysstat.tables;CREATE ALIAS DB2ADMIN.VIEWS FOR SYSCAT.VIEWScreate alias db2admin.columns for syscat.columns;create alias guest.columns for syscat.columns;4. 建立表create table zjt_tables as(select * from tables) definition only;create table zjt_views as(select * from views) definition only;5. 插入记录insert into zjt_tables select * from tables;insert into zjt_views select * from views;6. 建立视图create view V_zjt_tables as select tabschema,tabname from zjt_tables;7. 建立触发器CREATE TRIGGER zjt_tables_delAFTER DELETE ON zjt_tablesREFERENCING OLD AS OFOR EACH ROW MODE DB2SQLInsert into zjt_tables1 values(substr(o.tabschema,1,8),substr(o.tabname,1,10)) 8. 建立唯一性索引CREATE UNIQUE INDEX I_ztables_tabname[size=3]ON zjt_tables(tabname);9. 查看表select tabname from tableswhere tabname='ZJT_TABLES';10. 查看列select SUBSTR(COLNAME,1,20) as 列名,TYPENAME as 类型,LENGTH as 长度from columnswhere tabname='ZJT_TABLES';11. 查看表结构db2 describe table user1.departmentdb2 describe select * from user.tables12. 查看表的索引db2 describe indexes for table user1.department13. 查看视图select viewname from viewswhere viewname='V_ZJT_TABLES';14. 查看索引select indname from indexeswhere indname='I_ZTABLES_TABNAME';15. 查看存贮过程SELECT SUBSTR(PROCSCHEMA,1,15),SUBSTR(PROCNAME,1,15) FROM SYSCAT.PROCEDURES;16. 类型转换(cast)ip datatype:varcharselect cast(ip as integer)+50 from log_comm_failed17. 重新连接connect reset18. 中断数据库连接disconnect db2_gcb19. view applicationLIST APPLICATION;20. kill applicationFORCE APPLICATION(0);db2 force applications all (强迫所有应用程序从数据库断开) 21. lock tablelock table test in exclusive mode22. 共享lock table test in share mode23. 显示当前用户所有表list tables24. 列出所有的系统表list tables for system25. 显示当前活动数据库list active databases26. 查看命令选项list command options27. 系统数据库目录LIST DATABASE DIRECTORY28. 表空间list tablespaces29. 表空间容器LIST TABLESPACE CONTAINERS FORExample: LIST TABLESPACE CONTAINERS FOR 130. 显示用户数据库的存取权限GET AUTHORIZATIONSDB2 中merge into 的用法DB2 insert or update 解决方案(使用merge into 解决一条记录,或者多表关系问题)merge into table1 t1using (select column1 ,column2 from table2) t2on t1.column1 = t2.column1when matched then update set t1.column2 = t2.column2when not matched then insert values(column1,column2)以上是把 table2中的数据插入或者更新到table1中。