ORACLEoracle分页存储过程程的写法。

当前访客身份:游客 [
回归Java!积淀!
:从网上下载了 ibatis plugin for idea,运行之后...
:非常棒,条理清晰
:引用来自“ToB蓝波湾”的评论哈哈 58的? 我看到...
:哈哈 58的? 我看到了scf 还有之前架构部的数据库...
:引用来自“Hi徐敏”的评论发布到github 经常呗。...
:发布到github 经常呗。
:mark,好东西,有时间好好研究
:向牛人学习!
:up 最近改了下mybatis generator源码 可以自定义...
:引用来自“缓一缓”的评论楼主还有 那个 veloci...
今日访问:93
昨日访问:183
本周访问:1926
本月访问:1926
所有访问:189851
mybatis调用oracle存储过程
发表于2年前( 12:06)&&
阅读(5952)&|&评论()
0人收藏此文章,
mybatis调用oracle存储过程
博客原文:
存储过程在小公司用的不多,但是如果业务比较复杂或者性能要求比较苛刻的时候存储过程就派上用场了,ibatis的前期的一些版本貌似不支持存储过程因此我选择了mybatis来做实验。
1.无输入和输出参数的存储过程
我写了一个比较简单的,需要注意的是Oracle无参存储过程不能写括号
CREATE&OR&REPLACE&Procedure&cascadeoperation
&Delete&From&teacher&Where&id=1;
&Update&studentdetail&Set&address='宁波市海曙区'&Where&studentid=10;
这里执行了2个操作,可能用过mybatis的人会迷惑执行的时候到底使用update标签呢还是delete标签,其实都行,我也试过select标签也是OK的,下面是部分的配置文件
&delete&id="cascadeOperation"&statementType="CALLABLE"&&
&&&{call&cascadeoperation}
2.带有输入和输出参数的存储过程
,我这里加入了if else的几个判断
CREATE&OR&REPLACE&Procedure&queryTeacher(fid&In&Integer,Type&In&Varchar,Name&Out&Varchar)
If&Type='1'&then
Select&Name&Into&Name&From&student&Where&id=
Else&if&Type='2'&Then
Select&Name&Into&Name&From&teacher&Where&id=
&Name:='错误';
下面顺便把我在命令行窗口执行的存储过程语句贴出来
Name&&Varchar2(50);
queryteacher(3,'2',Name);
DBMS_OUTPUT.put_line(Name);
执行过类似语句的时候可能看不到任何的输出,不要着急只需在命令行使用
看到结果了吧,下面使用mybatis来执行这个存储过程,下面是映射文件的写法
&select&id="queryTeacher"&statementType="CALLABLE"&parameterType="java.util.Map"&
&&&{call&queryTeacher(#{fid,mode=IN,jdbcType=INTEGER},#{type,mode=IN,jdbcType=VARCHAR},#{name,mode=OUT,jdbcType=VARCHAR})}
那怎么取得返回的内容呢,其实只要存储过程执行后map里就有值了,java代码大致如下
Map&String,Object&&mm=new&HashMap&String,Object&();
&mm.put("fid",&3);
&mm.put("type",&2);
&m.queryTeacher(mm);
&System.out.println(mm.get("name"));
3.返回游标的存储过程
还有一种存储过程,它可以返回一个游标就类似一个集合这种
CREATE&OR&REPLACE&Procedure&getTeacher(cur_arg&out&Sys_Refcursor)
&&&&open&cur_arg&for&Select&*&From&
这种情况,在mybatis里就稍微有些不同了,此时jdbcType就是CURSOR,javaType则是ResultSet了,这里还可以把结果转成resultMap了,如下所示
&resultMap&id="resultMap3"&type="org.lxh..Teacher"&
&result&property="address"&column="address"/&
&result&property="name"&column="name"/&
&result&property="id"&column="id"/&
&&&&/resultMap&
&select&id="getAllTeacherInfo"&statementType="CALLABLE"&parameterType="java.util.Map"&&
&&&{call&GETTEACHER(#{result,jdbcType=CURSOR,mode=OUT,javaType=ResultSet,&resultMap=resultMap3})}
这里的话Java代码就稍微复杂一些
Map&String,&Object&&map&=&new&HashMap&String,&Object&();
m.getAllTeacher(map);
Set&Map.Entry&String,&Object&&&set&=&map.entrySet();
for&(Iterator&Map.Entry&String,&Object&&&it&=&set.iterator();&it
.hasNext();)&{
Map.Entry&String,&Object&&entry&=&(Map.Entry&String,&Object&)&it
//&System.out.println(entry.getKey()&+&"---&"&+
//&(Teacher)entry.getValue());
List&Teacher&&t&=&(List&Teacher&)&entry.getValue();
Iterator&Teacher&&itera&=&t.iterator();
while&(itera.hasNext())&{
Teacher&tt&=&itera.next();
System.out.println(tt.getName()&+&","&+&tt.getAddress());
到这里存储过程已经差不多了,研究了好久才弄出来,其他的用jdbc执行存储过程我随后会把文章添上来。
返回游标 &可以直接用下面的方法 &上面原作者的写法 太麻烦了
&&&&&&&&Map&map&=&new&HashMap();
&&&&&&&&map.put("jid",&jid);
&&&&&&&&userInfoMapper.getFriendList(map);
&&&&&&&&//result&为在mybatis&xml文件时&写的返回结果名
&&&&&&&&List&UserInfo&&list&=&(List&UserInfo&)map.get("result");
&&&&&&&&return&
更多开发者职位上
1)">1)">1" ng-class="{current:{{currentPage==page}}}" ng-repeat="page in pages"><li class='page' ng-if="(endIndex<li class='page next' ng-if="(currentPage
相关文章阅读[size=4] /* 建立取工作量的存储过程& */
CREATE or replace PROCEDURE proc_getWorkLoads_zd
(parameter1 OUT nvarchar2,taskidval IN& nvarchar2)
IS
cursor c is select t.Quantity, p.title from PRICEUNIT p,tTaskWordload t WHERE t.Unit = p.ID AND t.TaskID =
Quantity1 varchar2(500);&
Unit1 VARCHAR2(500);
BEGIN&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
& OPEN
& LOOP
&& FETCH c INTO Quantity1,Unit1;&&
exit when c %NOTFOUND;&&&&&&&&&&&&&&&&&&&&&&&&
&& parameter1 := parameter1||(Round(Quantity1,0)||Unit1) ;&&
&& END LOOP;&&
& CLOSE
& END proc_getWorkLoads_
从另外一个存储过程中的游标循环中调用上面的存储过程:
CREATE or replace PROCEDURE procGeneralAttemper(par_year IN nvarchar2, par_month IN nvarchar2)& /*暂时定的查询条件是月份*/
IS
&& /*用于循环的字段*/
&&&& ProjectID1 varchar(12) ;
&&&& ClientName1 varchar(60);
&&&& ProjectName1 varchar(30);
&&&& CreationDate1&
&&&& DeliveryTime1&
&&&& SrcLangs1&
&&&& ServiceType1 varchar(200);
&&&& Quantity1
&&&& MustGetMoney1 number(8,2);
&&&& PaidRate1&&&& number(8,2);
&&&& NotGetMoney1& number(8,2);
&&&& ResponsibilityPerson1& varchar(35);
&&&& Priority1& varchar(8);
&&&& Comment1
&&&& FeedBack1
&&&& isontime1 varchar(12) ;
&&&& isdelmodifysymbol1 varchar(12) ;
&&&& Worker1 varchar(30) ;
&&&& TaskID1 varchar(30) ;
&&&& str varchar(500);
&&&& RinvoiceId varchar(500);
&&&& Rworkloads varchar(2000);&&
&&&& Rworkloads1 varchar(2000);&&
&&&& pid varchar(12);
&&&& taskidval varchar(20);
&&& /*定义游标*/
& CURSOR c& IS
&& SELECT pro.ProjectID,
/* 项目ID*/
&&&& cli.ClientName,&&& /* 客户名称 */
&&&& pro.ProjectName,&& /* 项目名称/译件名称*/
&&&& pro.CreationDate,& /* 项目开始时间 */
&&&& pro.DeliveryTime,& /* 最后交件时间 */
&&&& concat(concat(t.SrcLang,'-'),t.tarLang) as SrcLangs& , /* 对译文种 */
&&&& ser.TYPENAME as ServiceType,&& /* 加工内容/项目流程*/
&&&& pro.Quantity,&&&&& /* 原文页数 */
&&& (pro.AggregateAmount*pro.Discount-pro.Fine) AS MustGetMoney,&&&&&&&&&&&& /* 应收款 */
&&&& pro.PaidRate,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& /* 已收款 */
&&& (pro.AggregateAmount*pro.Discount-pro.Fine-pro.PaidRate) AS NotGetMoney,/* 未收款 */
&&& pro.ResponsibilityPerson,&&&&&&&&&&&& /*& 经手人 */
&&& concat(sysp.name,'%') AS Priority,/* 加急程度 */
&&& pro."COMMENT", /* 备注 */
&&& pro.feedback, /* 备注 */
&&& pro.isontime, /* 备注 */
&&& pro.isdelmodifysymbol, /* 备注 */
&&& t.Worker,& /* 备注 */
&&& t.taskid
FROM tProject pro, tClient cli,tProjectTask t,SERVICETYPE ser,SystemParameter sysp
WHERE& pro.CreationDate &= to_date(par_year,'yyyy-mm-dd hh24:mi:ss') AND pro.CreationDate &= to_date(par_month,'yyyy-mm-dd hh24:mi:ss') AND pro.ClientID = cli.ClientID AND pro.isActive ='1'& AND t.isActive ='1' and pro.projectid = t.projectid and ser.id = t.servicetype and sysp.SysParKey = pro.Priority and sysp.isactive ='1' and sysp.type ='projectPriority' order by pro.
BEGIN&&&&
& begin
& select count(*) into i from user_tables where table_name='TEMP_GENERAL';
& if i&0 then
&&& execute immediate 'delete from TEMP_GENERAL';
& else
&&& str := 'CREATE GLOBAL TEMPORARY TABLE& TEMP_GENERAL (
ProjectID varchar(12) ,
ClientName varchar(60),
ProjectName varchar(30),
CreationDate& date,
DeliveryTime& date,
SrcLangs& clob,
ServiceType varchar(200),
Quantity clob,
MustGetMoney number,
PaidRate&&&& number,
NotGetMoney& number,
ResponsibilityPerson& varchar(35),
Priority& varchar(8),
"COMMENT" clob,
InvoiceID clob,
FeedBack clob,
isontime varchar(12),
isdelmodifysymbol varchar(12)
,Worker varchar(30)) ON COMMIT PRESERVE ROWS ';&&
& OPEN
& LOOP
&& FETCH c INTO ProjectID1, ClientName1, ProjectName1, CreationDate1, DeliveryTime1, SrcLangs1, ServiceType1,Quantity1, MustGetMoney1, PaidRate1,NotGetMoney1, ResponsibilityPerson1, Priority1,Comment1,FeedBack1,isontime1,isdelmodifysymbol1,Worker1,TaskID1;&
exit when c %NOTFOUND;
pid:= ProjectID1;
&&& taskidval:=TaskID1;
/* 调用子存储过程获取发票号的字符串 */
&&& str:=' call proc_getInvoiceID(:param1,:param2) ';
&&& execute immediate str using in out pid, RinvoiceId;
&&
&&& str:=' call proc_getWorkLoads_zd('||taskidval||',:parm1) ';
&&& execute immediate str using out& R
&& Rworkloads1 :=R
&
&& /*将数据插入临时表*/
&&& str:='INSERT INTO TEMP_GENERAL VALUES (:ProjectID1,:ClientName1,:ProjectName1,:CreationDate1,:DeliveryTime1,:SrcLangs1,:ServiceType1,:Rworkloads1,:MustGetMoney1,:PaidRate1,:NotGetMoney1,:ResponsibilityPerson1,:Priority1,:Comment1,:RinvoiceID,:FeedBack1,:isontime1,:isdelmodifysymbol1,:Worker1)';
execute immediate str using ProjectID1, ClientName1,ProjectName1, CreationDate1, DeliveryTime1, SrcLangs1,ServiceType1, Rworkloads1, MustGetMoney1, PaidRate1, NotGetMoney1,ResponsibilityPerson1, Priority1, Comment1, RinvoiceID,FeedBack1,isontime1,isdelmodifysymbol1,Worker1;
&& END LOOP;
& CLOSE
& END procGeneralA
调用总是有问题,没有办法获取数据 ,可能是我写错了下面这段调用的语句,请大家帮忙指点一下,小弟万分感谢!
str:=' call proc_getWorkLoads_zd('||taskidval||',:parm1) ';
&&& execute immediate str using out& R
直接Rworkloads=proc_getWorkLoads_zd('||taskidval||',:parm1)行么
已解决问题
未解决问题Oracle存储过程(增、删、改)写法_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
Oracle存储过程(增、删、改)写法
上传于||文档简介
&&O&#8203;r&#8203;a&#8203;c&#8203;l&#8203;e&#8203;存&#8203;储&#8203;过&#8203;程&#8203;(&#8203;增&#8203;、&#8203;删&#8203;、&#8203;改&#8203;)&#8203;写&#8203;法
阅读已结束,如果下载本文需要使用
想免费下载本文?
你可能喜欢如何开发ORACLE存储过程
IT168网站原创
 作者: JavaResearch 编辑:
  【IT168 技术文档】  在我的上一个银行项目中,我接到编写ORACLE存储过程的任务,我是程序员,脑袋里只有一些如何使用CALLABLE接口调用存储过程的经验,一时不知如何下手,我查阅了一些资料,通过实践发现编写ORACLE存储过程是非常不容易的工作,即使上路以后,调试和验证非常麻烦。简单地讲,Oracle存储过程就是存储在Oracle数据库中的一个程序。  一. 概述  Oracle存储过程开发的要点是:  & 使用Notepad文本编辑器,用Oracle PL/SQL编程语言写一个存储过程;  & 在Oracle数据库中创建一个存储过程;  & 在Oracle数据库中使用SQL*Plus工具运行存储过程;  & 在Oracle数据库中修改存储过程;  & 通过编译错误调试存储过程;  & 删除存储过程;  二.环境配置  包括以下内容:  & 一个文本编辑器N  & Oracle SQL*Plus工具,提交Oracle SQL和PL/SQL 语句到Oracle database。  & Oracle 10g express数据库,它是免费使用的版本;  需要的技巧:  & SQL基础知识,包括插入、修改、删除等  & 使用Oracle's SQL*Plus工具的基本技巧;  & 使用Oracle's PL/SQL 编程语言的基本技巧;  三.写一个存储过程  存储过程使用Oracle's PL/SQL 程序语言编写,让我们写一个什么工作都不做的存储过程,我们可以编译和运行它而不用担心会对数据库产生任何损害。  在Notepad, 写下:  CREATE OR REPLACE PROCEDURE skeleton  IS  BEGIN  NULL;  END;  把文件存为skeleton.sql.  让我们一行行遍历这个存储过程:  1 CREATE OR REPLACE PROCEDURE skeleton  2 IS  3 BEGIN  4 NULL;  5 END;  行1:  CREATE OR REPLACE PROCEDURE 是一个SQL语句通知Oracle数据库去创建一个叫做skeleton存储过程, 如果存在就覆盖它;  行2:  IS关键词表明后面将跟随一个PL/SQL体。  行3:  BEGIN关键词表明PL/SQL体的开始。  行4:  NULL PL/SQL语句表明什么事都不做,这句不能删去,因为PL/SQL体中至少需要有一句;  行5:  END关键词表明PL/SQL体的结束  四.创建一个存储过程  SQL语句CREATE OR REPLACE PROCEDURE在Oracle数据库中创建、编译和保存一个存储过程。  从Window打开SQL*Plus并且从SQL*Plus登录到你的数据库;打开skeleton.sql文件.  在SQL&命令提示符下输入以下命令:  SQL&@skeleton  SQL&/  SQL*Plus装载skeleton.sql文件的内容到SQL*Plus缓冲区并且执行SQL*Plus语句;SQL*Plus 会通知你存储过程已经被成功地创建。  现在你的存储过程被创建,编译和保存在你的Oracle数据库,我们可以运行它。  五.运行一个存储过程  从SQL*Plus 命令行提示符运行你的存储过程使用EXECUTE命令,如下:  SQL& EXECUTE  SQL*Plus 输出一下信息确信存储过程成功执行: PL/SQL procedure successfully completed.  你也可以在一个无名PL/SQL块内运行你的存储过程,在SQL*Plus命令提示符下,它看起来像:  SQL& BEGIN  2 SKELETON;  3 END;  4 /  现在我们已经运行了我们的存储过程,我们如何修改它呢?  六.修改一个存储过程  让我们写一个输出字符串&Hello World!&的存储过程,用Notepad打开你的skeleton.sql 文件,. 用DBMS_OUTPUT.PUT_LINE 过程调用去替换NULL语句,如下所示:  CREATE OR REPLACE PROCEDURE skeleton  IS  BEGIN  DBMS_OUTPUT.PUT_LINE('Hello World!');  END;  保存到文件skeleton.sql.  从SQL*Plus命令行, 打开文件skeleton.sql .  SQL& @skeleton  SQL&  1 CREATE OR REPLACE PROCEDURE skeleton  2 IS  3 BEGIN  4 DBMS_OUTPUT.PUT_LINE('Hello World!');  5* END;  SQL& /  SQL*Plus 通知你存储过程成功创建并输出提示信息:Procedure created.  SQL&  用EXECUTE 命令运行你的存储过程:  SQL& EXECUTE  SQL*Plus显示存储过程运行成功:PL/SQL procedure successfully completed.  我们想要的输出字符串 &Hello World!&没有出来,在显示一个DBMS_OUTPUT.PUT_LINE 结果前需要运行一个SET命令,在SQL*Plus 命令行提示符,键入:  SQL& SET SERVEROUTPUT ON  再次执行你的存储过程:  SQL& EXECUTE  现在结果输出了:Hello World!  PL/SQL procedure successfully completed.  七.调试一个存储过程  当调试一个存储过程时,遵循一样的步骤,修改SQL文件,创建存储过程,执行存储过程,根据编译器反馈的出错信息进行修改,这一步是非常繁琐的,需要依靠经验。  在实际的商用存储过程的开发调试过程中,由于涉及很多表、类型、光标、循环、条件等复杂的逻辑,和PL/SQL语句的灵活运用,编译时会产生很多错误提示信息,程序员在根据这些错误信息定位,进行修正,再编译最后得到正确的结构;  八.放弃一个存储过程  如果在数据库中你不在需要一个存储过程你可以删除它,SQL语句 DROP PROCEDURE 完成从数据库中删除一个存储过程,DROP PROCEDURE 在SQL中被归类为数据定义语言(DDL) 类操作,其他的例子有CREATE, ALTER, RENAME 和TRUNCATE。.  在SQL*Plus 命令提示符下,使用DROP PROCEDURE SQL 语句删除你的叫做skeleton的存储过程:  SQL& DROP PROCEDURE  SQL*Plus assures us the procedure has been removed:  Procedure dropped.  总结  本文详细讨论了如何使用Oracle工具开发Oracle商用存储过程的步骤。最后在存储过程的使用中可能是程序直接调用,也可能被触发器调用。
大学生分期购物销量榜
已有条评论
IT168企业级
正在努力加载文档,请稍等…oracle存储过程怎么写_百度知道
oracle存储过程怎么写
我想要一个存储过程,功能是查询出一张表(有一个date属性)的距离现在日期最近的5条记录。谁帮帮忙
提问者采纳
&row_number()&&is&t;dbms_&&loop&&&&&=&字段名&&&&nbsp.put_line(v_date);&&(select&&&&&&hh24;yyyy-mm-dd&v_date&&begin&&as&over(order&&cur,&&nbsp:ss&#39;&rn&&t_&&&&&where&&end&by&&&)&&&exit&cur&&nbsp,&t&&&&&&cursor&&open&&&select&&5;&&&&&v_from&&replace&&&表名)&cur%&&cur&nbsp.t_date&&&&&&&when&&p_date&procedure&&&into&&#39;&varchar2(30);&to_char(字段名;&&fetch&from&rn&&desc)&nbspcreate&or&nbsp
提问者评价
我的表不只一个字段,找半天错,原来是fetch into只存了一个值啊,解决了
来自团队:
其他类似问题
为您推荐:
其他2条回答
create procedure p1asselect * from select * from table_name order by date属性字段 desc where rownum&=5
select * from ( select * from table_name order by sysdate - date ) where rownum & 6
存储过程的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁}

我要回帖

更多关于 oracle分页存储过程 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信