您好,欢迎访问三七文档
DB2存储过程语法语法:CREATEPROCEDUREschema-name.procedure-name(参数)[属性]语句--参数:SQLPL存储过程中有三种类型的参数:IN:输入参数(默认值,也可以不指定)OUT:输出参数INOUT:输入和输出参数--属性1、LANGUAGESQL指定存储过程使用的语言。LANGUAGESQL是其默认值。还有其它的语言供选择,比如Java或者C,可以将这一属性值分别设置为LANGUAGEJAVA或者LANGUAGEC。2、DYNAMICRESULTSETSn如果您的存储过程将返回n个结果集,那么需要填写这一选项。3、SPECIFICmy_unique_name赋给存储过程一个唯一名称,如果不指定,系统将生成一个惟一的名称。一个存储过程是可以被重载的,也就是说许多个不同的存储过程可以使用同一个名字,但这些存储过程所包含的参数数量不同。通过使用SPECIFIC关键字,您可以给每一个存储过程起一个唯一的名字,这可以使得我们对于存储过程的管理更加容易。例如,要使用SPECIFIC关键字来删除一个存储过程,您可以运行这样的命令:DROPSPECIFICPROCEDURE。如果没有使用SPECIFIC这个关键字,您将不得不使用DROPPROCEDURE命令,并且指明存储过程的名字及其参数,这样DB2才能知道哪个被重载的存储过程是您想删除的。4、SQL访问级别NOSQL:存储过程中不能有SQL语句CONTAINSSQL:存储过程中不能有可以修改或读数据的SQL语句READSSQL:存储过程中不能有可以修改数据的SQL语句MODIFIESSQL:存储过程中的SQL语句既可以修改数据,也可以读数据默认值是MODIFIESSQL,一个存储过程不能调用具有更高SQL数据访问级别的其他存储过程。例如,被定义为CONTAINSSQL的存储过程可以调用被定义为CONTAINSSQL或NOSQL的存储过程。但是这个存储过程不能调用被定义为READSSQLDATA或MODIFIESSQL的其他存储过程。--语句可以是一条单独的语句或者是一组由BEGIN[ATOMIC]...END复合语句DB2数据库动态SQL应用今天写了一个db2的存储过程,分享一下:动态SQL的应用介绍DB2存储过程中,三种操作的动态SQL的应用动态表名DECLAREdb_tbnameVARCHAR(50);//定义动态表名变量SETdb_tbname=‘’||’’;//给动态表名变量赋值,||是连接符,相当于java中的+号DECLAREdb_sqlstrVARCHAR(1024);//定义动态SQL变量//准备动态插入SQL的拼装SETdb_sqlstr=‘INSERTINTO’||db_tbname||’(name,age)VALUES(?,?)’;//预定义两个问号PREPAREs2FROMdb_sqlstr;//给问号赋值并执行SQLEXECUTEs2USINGname,age;查询SQL的拼装及执行SETdb_sqlstr='set(?,?)=(SELECTname,ageFROMtablewherepid=?)’;PREPAREs1FROMdb_sqlstr;EXECUTEs1INTOout_name,out_ageUSINGpid;Set(?,?)这段的解释是:SELECTname,age将以预定义的方式,输出到某个字段中去,下一句EXECUTEs1INTOout_name,out_age则是承上的,也就是查出来的name和age,将赋值给out_name和out_age;USINGpid,则是查询语句中,where条件;DB2存储过程批量插入数据存储过程CREATEORREPLACEPROCEDURECSSSUPRD.TEST_ADD_DATA()LANGUAGESQLSPECIFICSQL130327103544500BEGINDECLAREv_casekeyINT;DECLAREv_fpnINT;DECLAREv_seqNumINT;DECLAREIINTdefault0;SETv_casekey=755;SETv_fpn=1;SETv_seqNum=1;WHILEI32000DOIFmod(I,2)=0THENinsertintotable.Avalues(v_casekey,v_fpn,'F',v_seqNum);ELSEinsertintotable.Avalues(v_casekey,v_fpn,'F',v_seqNum);--END;ENDIF;SETv_seqNum=v_seqNum+1;SETI=I+1;ENDWHILE;END#db2db2中的case语句两种语法模式:(1):CASEWHEN条件THEN结果1ELSE结果2END(2):CASE表达式1WHEN表达式2THEN结果1ELSE结果2END上面的WHEN可以重复多次,就像C中的SWITCH..CASE的表达下面详细的各举几个例子,这些例子可以用于ESQL和交互式的SQL中eg1:处理被0除SELECTCASEWHENfileld1=0THEN0ELSEfileld2/field1ENDFROMFILEeg2:字段值对应转换SELECTORDNO,CUSNAM,SHIPDATE,CASEWHENSHIPDATECURDATE()THEN'OVERDUE'WHENSHIPDATE=CURDATE()THEN'PROCESSING'WHENSHIPDATECURDATE()THEN'ACTIVE'ENDFROMFILEeg3:获取月份的名字:上面的例子SELECTORDNO,CUSNO,CASEMONTH(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'ENDFROMFILEdb2命令大全1.建立数据库DB2_GCBCREATEDATABASEDB2_GCBONG:ALIASDB2_GCBUSINGCODESETGBKTERRITORYCNCOLLATEUSINGSYSTEMDFT_EXTENT_SZ322.连接数据库connecttosample1userdb2adminusing83012063.建立别名createaliasdb2admin.tablesforsysstat.tables;CREATEALIASDB2ADMIN.VIEWSFORSYSCAT.VIEWScreatealiasdb2admin.columnsforsyscat.columns;createaliasguest.columnsforsyscat.columns;4.建立表createtablezjt_tablesas(select*fromtables)definitiononly;createtablezjt_viewsas(select*fromviews)definitiononly;5.插入记录insertintozjt_tablesselect*fromtables;insertintozjt_viewsselect*fromviews;6.建立视图createviewV_zjt_tablesasselecttabschema,tabnamefromzjt_tables;7.建立触发器CREATETRIGGERzjt_tables_delAFTERDELETEONzjt_tablesREFERENCINGOLDASOFOREACHROWMODEDB2SQLInsertintozjt_tables1values(substr(o.tabschema,1,8),substr(o.tabname,1,10))8.建立唯一性索引CREATEUNIQUEINDEXI_ztables_tabname[size=3]ONzjt_tables(tabname);9.查看表selecttabnamefromtableswheretabname='ZJT_TABLES';10.查看列selectSUBSTR(COLNAME,1,20)as列名,TYPENAMEas类型,LENGTHas长度fromcolumnswheretabname='ZJT_TABLES';11.查看表结构db2describetableuser1.departmentdb2describeselect*fromuser.tables12.查看表的索引db2describeindexesfortableuser1.department13.查看视图selectviewnamefromviewswhereviewname='V_ZJT_TABLES';14.查看索引selectindnamefromindexeswhereindname='I_ZTABLES_TABNAME';15.查看存贮过程SELECTSUBSTR(PROCSCHEMA,1,15),SUBSTR(PROCNAME,1,15)FROMSYSCAT.PROCEDURES;16.类型转换(cast)ipdatatype:varcharselectcast(ipasinteger)+50fromlog_comm_failed17.重新连接connectreset18.中断数据库连接disconnectdb2_gcb19.viewapplicationLISTAPPLICATION;20.killapplicationFORCEAPPLICATION(0);db2forceapplicationsall(强迫所有应用程序从数据库断开)21.locktablelocktabletestinexclusivemode22.共享locktabletestinsharemode23.显示当前用户所有表listtables24.列出所有的系统表listtablesforsystem25.显示当前活动数据库listactivedatabases26.查看命令选项listcommandoptions27.系统数据库目录LISTDATABASEDIRECTORY28.表空间listtablespaces29.表空间容器LISTTABLESPACECONTAINERSFORExample:LISTTABLESPACECONTAINERSFOR130.显示用户数据库的存取权限GETAUTHORIZATIONSDB2中mergeinto的用法DB2insertorupdate解决方案(使用mergeinto解决一条记录,或者多表关系问题)mergeintotable1t1using(selectcolumn1,column2fromtable2)t2ont1.column1=t2.column1whenmatchedthenupdatesett1.column2=t2.column2whennotmatchedtheninsertvalues(column1,column2)以上是把table2中的数据插入或者更新到table1中。但是对于开发人员程序来说,我们是一条一条记录来处理的,判断这条数据是insert还是update对于DB2的处理办法如下:mergeintotable1t1using(select程序中的数据1ascolumn1,程序中的数据2ascolumn2fromSYSIBM.SYSDUMMY1)t2//保证t2一定是有一条数据的,就是你程序中的那条数据,SYSIBM.SYSDUMMY1是db2专用的,当然这里你可以用别的办法来处理,比如用sele
本文标题:DB2存储过程语法
链接地址:https://www.777doc.com/doc-2909496 .html