展现层框架sqlmap调用存储过程

sqlmap配置文件增加的:

 <!--存储过程-->     

<parameterMapid="procParamMap"class="java.util.HashMap">

<parameterproperty="p_sbackCode"jdbcType="VARCHAR"javaType="java.lang.String"mode="IN"/>

<parameterproperty="p_iNodeLevel"jdbcType="INTEGER"javaType="java.lang.Integer"mode="IN"/>

</parameterMap>

<procedureid="countNodeLevel"parameterMap="procParamMap">

{callRASINFO.SETBACKPAY_NODELEVEL(?,?)}

  </procedure>

我们展现层框架(struts+dao+sqlmap)中DAO:

 

publicvoidadd(HashMapbfmap)

{

try

{

getSqlMap().insert("insertForTs_BACKPAYTYPE",bfmap);

          

   //插完值后还得调用yuanyun后台的一个存储过程RASINFO.SETBACKPAY_NODELEVEL;   //注意这个存储过程是没有返回值的,有返回值的存储过程调用方法还需要大家继续实践,共享

          HashMap params = new HashMap();

params.put("p_sbackCode","$");

params.put("p_iNodeLevel",newInteger(0));

getSqlMap().queryForList("countNodeLevel",params);

}

catch(SQLExceptionsqlexception)

{

thrownewDaoException("ErrorcreatingTs_BACKPAYTYPE.Cause:"+sqlexception);

}

     }

具体的存储过程(为yangyun提供的,其主要功能是根据具有树结构的数据的上下级关系算出每条数据的级数,这个存储过程只在后台运行,不给前台返回值)

CREATEORREPLACEProcedureRASINFO.SETBACKPAY_NODELEVEL(p_sbackCodeinvarchar2default'$',p_iNodeLevelinintdefault0)

AS

CursorsBackPayCur(p_sParentCodeinvarchar2)IS

SELECTBackCodeFROMRasInfo.TS_BackPayType

WHEREParentCode=p_sParentCode;

IINT;

v_sBackCodevarchar(10);

v_sParentCodevarchar(10);

BEGIN

IFp_sBackCode='$'THEN

v_sParentCode:='BP0ALL';

I:=1;

ELSE

v_sParentCode:=p_sbackCode;

I:=p_iNodeLevel;

   END IF;

   FOR S in sBackPayCur(v_sParentCode) LOOP

--修改点级别

UPDATERasInfo.TS_BackPayTypeSETNodeLevel=I

WHEREBackCode=S.backCode;

--先置叶点为0标志

UPDATERasInfo.TS_BackPayTypeSETLeafFlag='0'

WHEREBackCode=S.backCode;

--再置叶点确值

UPDATERasInfo.TS_BackPayTypeSETLeafFlag='1'

WHEREBackCode=S.backCode

ANDnotExists(select1fromRasInfo.TS_BackPayType

WHEREParentCode=S.backCode);

COMMIT;

SetBackPay_NodeLevel(S.backCode,I+1);

ENDLOOP;

END;

特别是这一部分:

1.<!--存储过程,如果没有返回列表,procTest的resultMap可以省略-->

2.<parameterMapid="procParamMap"class="java.util.HashMap">

3.<parameterproperty="id"jdbcType="INTEGER"javaType="java.lang.Integer"mode="IN"/>

4.<parameterproperty="outid"jdbcType="INTEGER"javaType="java.lang.Integer"mode="OUT"/>

5.<parameterproperty="errMsg"jdbcType="VARCHAR"javaType="java.lang.String"mode="OUT"/>

6.</parameterMap>

7.<resultMapid="procResultMap"class="java.util.HashMap">

8.<resultproperty="a"column="AAA"/>

9.<resultproperty="b"column="BBB"/>

10.<resultproperty="c"column="CCC"/>

11.</resultMap>

12.<procedureid="procTest"parameterMap="procParamMap"resultMap="procResultMap">

13.{calltest_sp_1(?,?,?)}

14.   </procedure>  

1.  public List procTest(Map params) throws Exception {   

2.Listret=(List)getSqlMapClientTemplate().queryForList("procTest",params);

3.returnret;

4.     }   

避免使用存储过程得一个小例子:

SQL> select * from emp;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO

---------------------------------------------------------------------------------------------

7839KINGPRESIDENT17-10月-81500010

7698BLAKEMANAGER783901-5月-81285030

7782CLARKMANAGER783918-7月-81245010

7566JONESMANAGER783902-4月-81297520

7654MARTINSALESMAN769828-9月-811250140030

7499ALLENSALESMAN769820-2月-81160030030

7844TURNERSALESMAN769818-9月-811500030

7900JAMESCLERK769803-12月-8195030

7521WARDSALESMAN769822-12月-81125050030

7902FORDANALYST756603-12月-81300020

7369SMITHCLERK790217-12月-8080020

7788SCOTTANALYST756604-12月-82300020

7876ADAMSCLERK778813-2月-83110020

7934 MILLER CLERK 7782 23-2月 -82 1300 10

14 rows selected.

SQL> select * from emp

2startwithempno=7566

3 connect by prior empno = mgr;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO

---------------------------------------------------------------------------------------------

7566JONESMANAGER783902-4月-81297520

7902FORDANALYST756603-12月-81300020

7369SMITHCLERK790217-12月-8080020

7788SCOTTANALYST756604-12月-82300020

7876 ADAMS CLERK 7788 13-2月 -83 1100 20

即找到7566所有下屬

JONES

--FORD

--SMITH

--SCOTT

-- ADAMS

Oracle用Startwith...ConnectBy子句递归查询

Startwith...ConnectBy子句递归查询一般用于一个表维护树形结构的应用。

创建示例表:

CREATETABLETBL_TEST

(

IDNUMBER,

NAMEVARCHAR2(100BYTE),

PIDNUMBERDEFAULT0

);

插入测试数据:

INSERTINTOTBL_TEST(ID,NAME,PID)VALUES('1','10','0');

INSERTINTOTBL_TEST(ID,NAME,PID)VALUES('2','11','1');

INSERTINTOTBL_TEST(ID,NAME,PID)VALUES('3','20','0');

INSERTINTOTBL_TEST(ID,NAME,PID)VALUES('4','12','1');

INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('5','121','2');

从Root往树末梢递归

select*fromTBL_TEST

startwithid=1

connect by prior id = pid

从末梢往树ROOT递归

select*fromTBL_TEST

startwithid=5

connect by prior pid = id

Start with...Connect By子句递归查询一般用于一个表维护树形结构的应用。 创建示例表: CREATE TABLE TBL_TEST(&n.

Oracle用Start with...Connect By子句递归查询. 作者:54powerman 的Blog. Start with...Connect By子句递归查询一般用于一个表维护树形结构的应用。 创建示例表:. CREATE TABLE TBL_TEST ( ID NUMBER, NAME VARCHAR2(100 BYTE), PID NUMBER DEFAULT 0 ...

(转)Oracle用Start with...Connect By子句递归查询. 原文出处:http://www.yourblog.org/Data/200612/496779.html Start with...Connect By子句递归查询一般用于一个表维护树形结构的应用。 创建示例表: CREATE TABLE TBL_TEST ...

唯一下载软件下载,软件,下载,共享,共享软件,免费,免费软件,汉化,汉化补丁,游戏,游戏下载,软件教程,软件新闻,软件资讯,操作系统,邮件.

Oracle用Start with...Connect By子句递归查询. ... 从Root往树末梢递归. select * from TBL_TEST start with id=1 connect by prior id = pid. 从末梢往树ROOT递归. select * from TBL_TEST start with id=5 connect by prior pid = id ...

Oracle用Start with...Connect By子句递归查询. 出处:统一教学网; 作者:54powerman 的Blog; 编辑:N/A; 发表日期:2006-6-25 16:00:00 ... 从Root往树末梢递归. select * from TBL_TEST start with id=1 connect by prior id = pid. 从末梢往树ROOT递归 ...

数据库栏OracleOracle用Start with...Connect By子句递归查询,电脑资讯,电脑快报,it资讯,网站建设资讯,教程基地.

Oracle用Start with...Connect By子句递归查询,Or,ra,ac,cl,le,e用,用S,St,ta,ar,rt,tw,wi,it,th,h.,..,..,.C,Co,on,nn,ne,ec,ct,tB,By,y子,子句,句递,递归,归查.

Oracle用Start with...Connect By子句递归查询,数据库使用技巧,网络大本营是一个专门发布编程资料,计算机相关技巧的大型网站,收集的资料非常之多,做中国最大的IT技术库和编程数据库!

简单的ORACLE存储过程  

--工资加500,OLD。SAL>2500 不加,NEW。SAL>2500 则改为2500;

SELECT * FROM EMP                                                                --加工资之前

CREATE OR REPLACE PROCEDURE SP_ADD (add IN number) is       --add参数接收传入的工资增幅

     --DECLARE

--CURSORemp_curISSELECT*FROMemp;

BEGIN

     FOR  sal_sum IN (SELECT * FROM emp) LOOP    --使用循环游标隐式打开游标emp_cur或    

                                                                                   --(SELECT * FROM emp)(在FOR循环中不需要声明此游标)

--自动从活动集获取行,然后在处理完所有行时关闭游标

IFsal_sum.sal>2500THEN--逐行进行比较赋值

UPDATEempSETsal=sal_sum.salWHEREempno=sal_sum.empno;

ELSIF(sal_sum.sal+add)>2500THEN

UPDATEempSETsal=2500WHEREempno=sal_sum.empno;

ELSE

UPDATEempSETsal=sal_sum.sal+addWHEREempno=sal_sum.empno;

ENDIF;

ENDLOOP;

END;

BEGIN

SP_ADD(500);--输入增资的幅度

END;

SELECT * FROM EMP                                                                 --加工资之后  

相关推荐