- CREATE PROCEDURE proc_with_variables (IN p_empno VARCHAR(6))
- LANGUAGE SQL
- SPECIFIC proc_with_vars -- applies to LUW and iSeries
- -- WLM ENVIRONMENT <env> -- applies to zSeries
- BEGIN
- DECLARE v_empno VARCHAR(6);
- DECLARE v_total, v_count INTEGER DEFAULT 0;
- SELECT empno INTO v_empno FROM employee WHERE empno = p_empno ;
- END
- ==============================================================================
- CREATE PROCEDURE set_variables ()
- LANGUAGE SQL
- SPECIFIC set_variables -- applies to LUW and iSeries
- -- WLM ENVIRONMENT <env> -- applies to zSeries
- BEGIN
- DECLARE v_rcount INTEGER;
- DECLARE v_max DECIMAL(9,2);
- DECLARE v_adate,v_another DATE;
- DECLARE v_total INTEGER DEFAULT 0; -- (1)
- SET v_total = v_total + 1; -- (2)
- SELECT MAX(salary) INTO v_max FROM employee; -- (3)
- VALUES CURRENT DATE INTO v_adate; -- (4)
- SELECT CURRENT DATE, CURRENT DATE
- INTO v_adate, v_another
- FROM SYSIBM.SYSDUMMY1; -- (5)
- END
- CREATE PROCEDURE registersample ( OUT p_start TIMESTAMP
- , OUT p_end TIMESTAMP
- , OUT p_c1 TIMESTAMP
- , OUT p_c2 TIME
- , OUT p_user CHAR(20))
- LANGUAGE SQL
- SPECIFIC registersample -- applies to LUW and iSeries
- -- WLM ENVIRONMENT <env> -- applies to zSeries
- BEGIN
- CREATE TABLE datetab (c1 TIMESTAMP,c2 TIME,c3 DATE);
- VALUES CURRENT TIMESTAMP INTO p_start; -- (1)
- INSERT INTO datetab VALUES( CURRENT TIMESTAMP
- , CURRENT TIME
- , CURRENT DATE + 3 DAYS); -- (2)
- SELECT c1,c2 INTO p_c1,p_c2 FROM datetab;
- VALUES CURRENT TIMESTAMP INTO p_end;
- SET p_user = USER; -- (3)
- DROP TABLE datetab;
- END
- 添加新员工的一段存储过程:
- =================
- CREATE PROCEDURE add_new_employee ( IN p_empno VARCHAR(6) -- (1)
- , IN p_firstnme CHAR(12)
- , IN p_midinit CHAR(1)
- , IN p_lastname VARCHAR(15)
- , IN p_deptname VARCHAR(30)
- , IN p_edlevel SMALLINT
- , OUT p_status VARCHAR(100)
- , OUT p_ts TIMESTAMP)
- LANGUAGE SQL
- SPECIFIC add_new_employee -- applies to LUW and iSeries
- -- WLM ENVIRONMENT <env> -- applies to zSeries
- BEGIN
- DECLARE v_deptno CHAR(3) DEFAULT ' '; -- (2)
- DECLARE v_create_ts TIMESTAMP; -- (3)
- SET v_create_ts = CURRENT TIMESTAMP;
- /* Get the corresponding department number */
- SELECT deptno
- INTO v_deptno -- (4)
- FROM department
- WHERE deptname = p_deptname;
- /* Insert new employee into table */ -- (5)
- INSERT INTO employee ( empno
- , firstnme
- , midinit
- , lastname
- , workdept
- , hiredate
- , edlevel)
- VALUES ( p_empno
- , p_firstnme
- , p_midinit
- , p_lastname
- , v_deptno
- , DATE(v_create_ts)
- , p_edlevel );
- SET p_status = 'Employee added'; -- (6)
- SET p_ts = v_create_ts; -- (7)
- END
- =================
- 一个小例子:
- CREATE PROCEDURE p2( IN TRY_SQLCODE VARCHAR(10))
- DYNAMIC RESULT SETS 1
- LANGUAGE SQL
- BEGIN
- DECLARE SQLCODE INT;
- DECLARE ERR5 VARCHAR(40) default '初始值';
- DECLARE ERR3 VARCHAR(40);
- DECLARE ERR2 VARCHAR(40);
- DECLARE ERR1 VARCHAR(40);
- DECLARE ERRID VARCHAR(40);
- DECLARE CUR_SQLCODE CURSOR WITH RETURN TO CLIENT FOR SELECT * FROM RI;
- DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
- SET ERR5 = char(SQLCODE);
- SELECT ID
- INTO ERRID
- FROM RINGS
- WHERE ID=TRY_SQLCODE; --创造各种sqlcode条件的参数
- IF SQLCODE = 100 THEN
- SET ERR1='NOT FOUND';
- INSERT INTO RINGS VALUES('1',ERR1);
- ELSEIF SQLCODE < 0 THEN
- SET ERR3 = 'EXCEPTION';
- INSERT INTO RINGS VALUES('3',ERR3);
- END IF;
- INSERT INTO RINGS VALUES('100',ERR5);
- COMMIT;
- OPEN CUR_SQLCODE;
- END
- 1. JAVA 调用db2存储过程最简单的例子:
- 存储过程创建代码:
- sql 代码
- SET SCHEMA IES ;
- Create procedure ies.test()
- LANGUAGE SQL
- Update t_ryxx set xm =’xy’ where ryxxid=’xm’
- java 代码
- conn = DbMaster.getConn();
- System.out.println("begin………");
- proc = conn.prepareCall("{call test()}");
- proc.execute();
- 2. Java调用db2带输入参数存储过程的例子:
- Db2创建存储过程的代码:
- sql 代码
- Drop procedure ies.test();
- SET SCHEMA IES ;
- Create procedure ies.test(in i_ryxxid varchar(50))
- LANGUAGE SQL
- Update t_ryxx set xm =’xy’ where ryxxid=i_ryxxid
- java 代码
- conn = DbMaster.getConn();
- System.out.println("begin");
- proc = conn.prepareCall("{call test(?)}");
- proc.setString(1,"RY0003");
- proc.execute();
- System.out.println("end:");
- 3.有输入输出参数的代码:
- 创建存储过程的代码:
- sql 代码
- SET SCHEMA IES ;
- CREATE PROCEDURE IES.test (IN in_ryxxid varchar(50),out out_xm varchar(50))
- LANGUAGE SQL
- select xm into out_xm from ies.t_ryxx where ryxxid=in_ryxxid;
- java 代码
- proc = conn.prepareCall("{ call test(?,?)}");
- proc.setString(1, "011900380103");
- proc.registerOutParameter(2, Types.VARCHAR);
- proc.execute();
- String xm = proc.getString(2);
- System.out.println("end:"+xm);
- 4.带有游标的存储过程(不知道这里的游标什么时候close的。刚开始学,不懂 菜鸟真郁闷)
- 创建存储过程的代码:(这个存储过程的具体看上面一篇文章:DB2 存储过程开发最佳实践(转载)的最佳实践 3:正确设定游标的返回类型。http://acme1921209.javaeye.com/blog/97829)
- sql 代码
- SET SCHEMA IES ;
- CREATE PROCEDURE IES.test (IN in_state varchar(50))
- result set 1
- language sql
- P1:BEGIN
- DECLARE CUR cursor with return for select rybh,xm from ies.t_ryxx where ryzt=in_state with ur;
- OPEN CUR;
- END P1;
- java 代码
- proc = conn.prepareCall("{ call test(?)}");
- proc.setString(1, "停用");
- proc.execute();
- rst = proc.getResultSet();
- while(rst.next()){
- System.err.println(rst.getString(1)+" "+rst.getString(2));
- }
- ====返回多个结果集的处理方法:
- db2 8.2 存储过程创建代码:
- sql 代码
- create procedure getpeople()
- dynamic result sets 2
- READS SQL DATA
- LANGUAGE SQL
- BEGIN
- DECLARE rs1 CURSOR WITH RETURN TO CLIENT FOR
- SELECT RYBH,XM FROM IES.T_RYXX WHERE RYZT='停用' with ur;
- DECLARE rs2 CURSOR WITH RETURN TO CALLER FOR
- SELECT RYBH ,XM FROM IES.T_RYXX WHERE RYZT='正常' with ur;
- OPEN rs1;
- OPEN rs2;
- END;
- java 代码
- proc = conn.prepareCall("{ call getpeople()}");
- proc.execute();
- rst = proc.getResultSet();
- int i = 2 ,j = 0;
- while(rst.next()&&j//j的作用:记录太多了,只想打印几个测试下
- System.out.println(rst.getString(1)+" "+rst.getString(2));
- j++;
- }
- System.err.println("---------------------------------------------");
- if (proc.getMoreResults()){ //getMoreResults()具体看api文档
- j = 0;
- while(rst.next()&&j//j的作用:记录太多了,只想打印几个测试下
- System.out.println(rst.getString(1)+" "+rst.getString(2));
- j++;
- }
- }
- j = 0;
- ==============================================================================
- db2 存储过程常用语句格式
- http://hi.baidu.com/heiru/blog/item/fb4132adb07e7e074a36d631.html
- ----定义
- DECLARE CC VARCHAR(4000);
- DECLARE SQLSTR VARCHAR(4000);
- DECLARE st STATEMENT;
- DECLARE CUR CURSOR WITH RETURN TO CLIENT FOR CC;
- ----执行动态SQL不返回
- PREPARE st FROM SQLSTR;
- EXECUTE st;
- ----执行动态SQL返回
- PREPARE CC FROM SQLSTR;
- OPEN CUR;
- ----判断是否为空,使用值替代
- COALESCE(判断对象,替代值)
- ----定义临时表
- DECLARE GLOBAL TEMPORARY TABLE SESSION.TempResultTable
- (
- Organization int,
- OrganizationName varchar(100),
- AnimalTypeName varchar(20),
- ProcessType int,
- OperatorName varchar(100),
- OperateCount int
- )
- WITH REPLACE -- 如果存在此临时表,则替换
- NOT LOGGED;
- ----字符串函数
- Substr
- ----隐形游标迭代
- for 游标名 as select....... do
- 使用 游标名.字段名
- 内容区块
- end for;
- ----直接返回值或变量
- declare rs1 cursor with return to caller for select 0 from sysibm.sysdummy1;
- ----判断表是否存在
- select count(*) into @exists from syscat.tables where tabschema = current schema and tabname='ZY_PROCESSLOG';
- ----取前面N条记录
- FETCH FIRST N ROWS ONLY
- ----定义返回值
- declare rs0 cursor with return to caller for select 0 from sysibm.sysdummy1;
- declare rs1 cursor with return to caller for select 1 from sysibm.sysdummy1;
- ----得到插入的自增长列最大值
- VALUES IDENTITY_VAL_LOCAL() INTO 变量
- ==============================================================================
- DB2中执行动态SQL的例子
- http://www.cnblogs.com/kfarvid/archive/2009/11/03/1595064.html
- CREATE PROCEDURE REFERESH_ZHAOGW
- (
- IN ODD_TABLE_NAME VARCHAR(100),
- IN ODS_TABLE_NAME VARCHAR(100)
- )
- LANGUAGE SQL
- BEGIN
- DECLARE SSQL VARCHAR(1000) ;
- SET SSQL='CREATE TABLE '||ODS_TABLE_NAME||' AS SELECT * FROM '||ODD_TABLE_NAME ;
- PREPARE S1 FROM SSQL;
- EXECUTE S1;
- END;
DB2的几个存储过程实例
最新推荐文章于 2023-07-06 15:59:10 发布