请问Oracle存储过程如何返回游标?有俩种方法:
一种是声明系统游标,一种是声明自定义游标,然后后面操作一样,参数类型为
in out 或out
(1)声明个人系统游标.(推荐)
create or replace p_temp_procedure
(
cur_arg out sys_refcursor;--方法1
)
begin
open cur_arg for select * from tablename;
end
调用
declare
cur_calling sys_refcursor;
begin
p_temp_procedure(cur_calling);--这样这个游标就有值oracle怎么返回游标了
for rec_next in cur_calling loop
....
end loop;
end;
(2)在包头中申明一个游表类型,然后调用者申明一个这个类型oracle怎么返回游标的游标变量,传给返回游标的存储过程 ,存储过程out这个结果集,这种方法很麻烦.游标类型不能像索引表一样使用create or replace type方法来创建,所以只能在包中申明,并且需要使用/来执行,后面的存储过程才认这个游标类型.(不推荐,但是建议要知道并且要会这种方式,毕竟它有它存在的道理)
--定义全局变量
create or replace package pkg_package
as
type type_cursor is ref cursor;
type type_record is record
(
test01 varchar2(32),
test02 varchar2(32),
test03 varchar2(32)
);
end;
/
--创建返回游标的存储过程
create or replace procedure p_temp_procedure
(
cur_out_arg out pkg_package.type_cursor
)
is
begin
open cur_out_arg for select * from test;
end;
/
--调用
declare
cur_out_arg pkg_package.type_cursor;
rec_arg pkg_package.type_record;
begin
p_temp_procedure(cur_out_arg);
fetch cur_out_arg into rec_arg;
dbms_output.put_line(rec_arg.test01);
dbms_output.put_line(rec_arg.test02);
dbms_output.put_line(rec_arg.test03);
end;
请问:在oracle中的过程中怎么返回一个游标?oracle中有很多经常用到的包oracle怎么返回游标 , oracle怎么返回游标他们功能强大,能够完成很多复杂,和不可想象的任务,所以我想请大家帮忙整理出来,不管是高手还是新人只要有对某个包比较熟悉,或者对oracle怎么返回游标他的一种使用方法比较熟悉,请帮忙跟贴,对大家的管理工作应该都会有很大帮助的 。我先抛砖引玉写一个,希望版主和同志们帮忙 。
------------------------------------------------------------------------------------
DBMS_SQL
一oracle怎么返回游标:)带有参数及解释
1、OPEN_CURSOR:返回新游标的ID值
2、PARSE:解析要执行的语句
3、BIND_VARIABLE:将给定的数量与特定的变量相连接
4、DEFINE_COLOUMN:定义字段变量,其值对应于指定游标中某个位置元素的值
(仅用于SELECT语句)
5、EXECUTE:执行指定的游标
6、EXECUTE_AND_FETCH:执行指定的游标并取记录
7、FETCH_ROWS:从指定的游标中取出记录
8、COLUMN_VALUE:返回游标中指定位置的元素
9、IS_OPEN:当指定的游标状态为OPEN时返回真值
10、CLOSE_CURSOR:关闭指定的游标并释放内存
11、LAST_ERROR_POSITION:返回出错SQL语句的字节偏移量
12、LAST_ROW_ID:返回最后一条记录的ROWID
13、LAST_SQL_FUNCTION_CODE:返回语句的SQL FUNCTION CODE
二:使用实例:
CREATE OR REPLACE
procedure dml_sql (the_rq varchar2) as
The_c1 Integer;
The_result Integer;--dml_sql_result
M_jls number;
The_xh varchar2(2);
Begin
The_xh:=lpad(ltrim(the_rq),2,'0');
The_C1 :=Dbms_sql.open_cursor;
Dbms_sql.parse(the_C1,'select count(*) from user_indexes
where table_name =''ZDCHB'''||the_xh,dbms_sql.v7);
Dbms_sql.define_column(the_c1,1,M_jls);
The_result:=Dbms_sql.execute(The_c1);
If dbms_sql.fetch_rows(cursor1) ; 0 then
Dbms_sql.column_value(cursor1,1,M_jls);
End if;
Dbms_sql.close_cursor(The_C1);
End;
大家不一定按这个模式来,也不一定要写的这么复杂,知道多少就写多少,整理出来,以后如果能够想用什么包到chinaunix里都能查到,就好了,呵呵!
--------------------------------------------------------------------------------
txfy 回复于:2003-09-16 15:03:09
二:dbms
DBMS_JOB 包介绍
调度任务队列里的任务要使用DBMS_JOB包中的过程 。使用任务队列不需要特别的数据库特权 。任何可以使用这些过程的用户都可以使用任务队列 。
1:参数
SUBMIT
-- 向任务队列提交一个任务
REMOVE
-- 从任务队列中删除指定的任务
CHANGE
-- 改变任务
WHAT
-- 改变指定任务的任务内容
NEXT_DATE
-- 改变指定任务的下一次执行时间
INTERVAL
--改变指定任务的执行时间间隔 。
BROKEN
-- 禁止指定任务的执行
RUN
--强制执行指定的任务
----------------------------------------------------------------------------------------------------------------------
2:使用方法
1)向任务队列提交一个任务(submit)
DBMS_JOB.SUBMIT(jobOUTBINARY_INTEGER,
whatINVARCHAR2,
next_dateINDATE DEFAULT SYSDATE,
intervalINVARCHAR2 DEFAULT 'null',
no_parseINBOOLEAN DEFAULT FALSE)
其中interval指定方式为:
'SYSDATE7'每7天一次
'SYSDATE1/48'每半个小时一次
'NEXT_DAY(TRUNC(SYSDATE), ''MONDAY'')15/24' 每个礼拜一的下午3点执行
'NEXT_DAY(ADD_MONTHS(TRUNC(SYSDATE, ''Q''), 3), ''THURSDAY'')'每个季度的第一个星期四
2)删除任务队列中的任务(remove)
DBMS_JOB.REMOVE(job IN BINARY_INTEGER)
The following statement removes job number 14144 from the job queue:
DBMS_JOB.REMOVE(14144);
3)指定任务的任务内容(WHAT)
DBMS_JOB.WHAT( jobINBINARY_INTEGER,
whatINVARCHAR2)
4)指定下次执行时间,如果你暂时不想让它执行可以设成3004年,呵呵!(next_date)
DBMS_JOB.NEXT_DATE( jobINBINARY_INTEGER,
next_dateINDATE)
5)指定任务的执行时间间隔(NTERVAL)
DBMS_JOB.INTERVAL( jobIN BINARY_INTEGER,
intervalIN VARCHAR2)
-----------------------------------------------------------------------------------------------------------------------
3:查询状态
显示任务的状态和失败执行的次数 。
SELECT job, next_date, next_sec, failures, broken
FROM user_jobs;
JOBNEXT_DATE NEXT_SEC FAILURESB
---------- --------- -------- -----------
912501-NOV-94 00:00:004N
1414424-OCT-94 16:35:350N
4176201-JAN-00 00:00:0016Y
显示当前运行的任务的信息 。
SELECT sid, r.job, log_user, r.this_date, r.this_sec
FROM dba_jobs_running r, dba_jobs j
WHERE r.job = j.job;
SIDJOBLOG_USERTHIS_DATETHIS_SEC
---------- ---------- -------------------- -----------------
1214144JFEE24-OCT-9417:21:24
258536SCOTT24-OCT-9416:45:12
ibatis 怎么返回oracle游标问题总结:
1.index by表不能存储在数据库中oracle怎么返回游标的type中,故选择嵌套表 。
2.ibatis不支持oracle的复合数据类型的返回 。(个人理解)
3.替代方案:用返回oracle游标来代替复合数据类型 。ibatis能接受oracle游标类型 。
注意此处是ibatis2.3
部分代码:
1.java
复制代码
1 private MapString,Object userStateResult(Users users)throws Exception{
2 MapString,Object param = new HashMapString,Object();
3 param.put("PRM_USERID", users.getUserid().toString());
4 param.put("PRM_OBJECTS", null);
5 param.put("PRM_TAGS", null);
6 param.put("PRM_APPCODE", null);
7 param.put("PRM_ERRMSG", null);
8 getDao().queryForList("user.prc_user_index",param);
9 if(Constant.SUCCESS.equals(param.get("PRM_APPCODE"))){
10 return param;
11 }else{
12 return null;
13 }
14 }
复制代码
返回值(包括游标的返回值)都在param这个map中
2.ibatis代码:
复制代码
1 parameterMap class="java.util.Map" id="UserIndexParam"
2parameter property="PRM_USERID" javaType="java.lang.String"
3jdbcType="VARCHAR" mode="IN" /
4parameter property="PRM_OBJECTS" javaType="java.sql.ResultSet"
5jdbcType="ORACLECURSOR" mode="OUT" resultMap="ref_object" /
6parameter property="PRM_TAGS" javaType="java.sql.ResultSet"
7jdbcType="ORACLECURSOR" mode="OUT" resultMap="ref_tag" /
8parameter property="PRM_APPCODE" javaType="java.lang.String"
9jdbcType="VARCHAR" mode="OUT" /
10parameter property="PRM_ERRMSG" javaType="java.lang.String"
11jdbcType="VARCHAR" mode="OUT" /
12/parameterMap
13 ---------------------------------------------------------------------------------
14resultMap id="ref_tag" class="com.diy.tag.entity.Tag"
15result column="tagid" jdbcType="VARCHAR" property="tagid" /
16result column="tagname" jdbcType="VARCHAR" property="name" /
17/resultMap
18
19resultMap class="com.diy.comm.cursorHandler.ObjectHandler" id="ref_object"
20result column="OBJECTID" jdbcType="DECIMAL" property="objectid" /
21result column="OWNERID" jdbcType="DECIMAL" property="ownerid" /
22result column="DBUSID" jdbcType="DECIMAL" property="dbusid" /
23result column="DUSERSID" jdbcType="DECIMAL" property="dusersid" /
24result column="TAGID" jdbcType="VARCHAR" property="tagid" /
25result column="USERNAME" jdbcType="VARCHAR" property="username" /
26result column="OBJNAME" jdbcType="VARCHAR" property="objname" /
27result column="LOVENUM" jdbcType="DECIMAL" property="lovenum" /
28result column="INRUDUCTION" jdbcType="VARCHAR" property="inruduction" /
29result column="CATAGROY" jdbcType="DECIMAL" property="catagroy" /
30result column="IMAGEPATH" jdbcType="VARCHAR" property="imagepath" /
31/resultMap
32 ---------------------------------------------------------------------------
33 procedure id="prc_user_index" parameterMap="UserIndexParam"
34{call
35PKG_USER.PRC_USER_INDEXVIEW(?,?,?,?,?)}
36/procedure
复制代码
有一篇文章写的很好:大家可以参考一下
但是对于本问题没有用ibatis的TypeHandler 。
因为存储过程调试可以返回游标数据oracle怎么返回游标 , 但是ibatis接受的到全部是null 。不知道原因,有知道的朋友可以留言一下 。
我个人猜测可能是ibatis版本问题 。
3.存储过程代码(部分):
复制代码
--对象类型
CREATE OR REPLACE TYPE TAGS_INFO IS object
(
TAGIDnumber,
TAGNAME varchar2(200)
)
--嵌套表
CREATE OR REPLACE TYPE table_tag IS TABLE OF TAGS_INFO
注意对象和嵌套表都要放在全局的 。不能定义在包体中
--兴趣游标
TYPE TAGCURSOR IS REF CURSOR;
--东西游标
TYPE OBJECTCURSOR IS REF CURSOR;--这个定义在包体中
------------------------------------------------------------------------
PROCEDURE PRC_USER_INDEXVIEW(PRM_USERIDIN VARCHAR2,
PRM_OBJECTS OUT OBJECTCURSOR,
PRM_TAGSOUT TAGCURSOR,
PRM_APPCODE OUT VARCHAR2,
PRM_ERRMSGOUT VARCHAR2) IS
N_FLAGNUMBER;
VAR_FIRSTTAG VARCHAR2(100);
VAR_DUSERIDVARCHAR2(100);
INDEX_TAGSTABLE_TAG;
--用户兴趣标签
CURSOR CUR_USERTAG IS
SELECT C.TAGID, C.NAME
FROM USERSDETIAL A, TAGRELATION B, TAG C
WHERE A.DUSERSID = B.DUSERSID
AND B.TAGID = C.TAGID
AND A.DUSERSID = VAR_DUSERID;
--公共兴趣标签
CURSOR CUR_USERPUB IS
SELECT T.*
FROM (SELECT ROWNUM AS RNUM,
COUNT(A.DUSERSID) AS CNUM,
B.TAGID,
B.NAME
FROM TAGRELATION A, TAG B
WHERE A.TAGID = B.TAGID
GROUP BY A.DUSERSID, B.TAGID, B.NAME, ROWNUM) T
WHERE RNUM = 8
ORDER BY T.CNUM DESC;
--object
/*CURSOR CUR_OBJ(VAR_TAGID VARCHAR2) IS
SELECT ROWNUM AS RN, A.*
FROM OBJECT A
WHERE trim(A.TAGID) = VAR_TAGID
AND ROWNUM30;*/
REC_USERTAG CUR_USERTAG%ROWTYPE;
REC_USERPUB CUR_USERPUB%ROWTYPE;
--REC_OBJOBJECT%ROWTYPE;
BEGIN
PRM_APPCODE := PKG_COMM.DEF_OK;
PRM_ERRMSG:= '';
IF PRM_USERID IS NULL THEN
PRM_APPCODE := PKG_COMM.DEF_ERR;
PRM_ERRMSG:= '参数未定义';
RETURN;
END IF;
--用户详细ID是否存在
SELECT B.DUSERSID
INTO VAR_DUSERID
FROM USERS A, USERSDETIAL B
WHERE A.USERID = B.USERSID
【oracle怎么返回游标 oracle返回码大全】AND A.USERID = PRM_USERID;
IF VAR_DUSERID IS NULL THEN
PRM_APPCODE := PKG_COMM.DEF_ERR;
PRM_ERRMSG:= '参数无效';
RETURN;
END IF;
--1.判断是否为有效用户
SELECT NVL(A.FLAG, 1)
INTO N_FLAG
FROM USERS A, USERSDETIAL B
WHERE A.USERID = B.USERSID
AND B.DUSERSID = VAR_DUSERID;
IF N_FLAG = 1 THEN
PRM_APPCODE := PKG_COMM.DEF_ERR;
PRM_ERRMSG:= '用户已被禁止登录';
RETURN;
END IF;
--2.判断用户是否有兴趣tag
FOR REC_USERTAG IN CUR_USERTAG LOOP
INDEX_TAGS := TABLE_TAG();
IF CUR_USERTAG%ROWCOUNT = 0 THEN
--获取公共兴趣游标
FOR REC_USERPUB IN CUR_USERPUB LOOP
INDEX_TAGS.EXTEND;
IF CUR_USERPUB%ROWCOUNT = 1 THEN
VAR_FIRSTTAG := REC_USERPUB.TAGID;
END IF;
INDEX_TAGS(CUR_USERPUB%ROWCOUNT) := TAGS_INFO(REC_USERPUB.TAGID,
REC_USERPUB.NAME);
END LOOP;
ELSIF CUR_USERTAG%ROWCOUNT = 1 THEN
VAR_FIRSTTAG := REC_USERTAG.TAGID;
END IF;
INDEX_TAGS.EXTEND;
INDEX_TAGS(CUR_USERTAG%ROWCOUNT) := TAGS_INFO(REC_USERTAG.TAGID,
REC_USERTAG.NAME);
--index_tags(CUR_USERTAG%ROWCOUNT).TAGNAME := REC_USERTAG.NAME;
END LOOP;
IF INDEX_TAGS.COUNT0 THEN
/* --3. 取出object
FOR REC_OBJ IN CUR_OBJ(VAR_FIRSTTAG) LOOP
PRM_OBJECTS(CUR_OBJ%ROWCOUNT).OWNERID := REC_OBJ.OWNERID;
PRM_OBJECTS(CUR_OBJ%ROWCOUNT).OBJECTID := REC_OBJ.OBJECTID;
PRM_OBJECTS(CUR_OBJ%ROWCOUNT).DBUSID := REC_OBJ.DBUSID;
PRM_OBJECTS(CUR_OBJ%ROWCOUNT).DUSERSID := REC_OBJ.DUSERSID;
PRM_OBJECTS(CUR_OBJ%ROWCOUNT).TAGID := REC_OBJ.TAGID;
PRM_OBJECTS(CUR_OBJ%ROWCOUNT).LOVENUM := REC_OBJ.LOVENUM;
PRM_OBJECTS(CUR_OBJ%ROWCOUNT).INRUDUCTION := REC_OBJ.INRUDUCTION;
PRM_OBJECTS(CUR_OBJ%ROWCOUNT).CATAGROY := REC_OBJ.CATAGROY;
PRM_OBJECTS(CUR_OBJ%ROWCOUNT).Imagepath := REC_OBJ.Imagepath;
END LOOP;*/
--返回东西游标
OPEN PRM_OBJECTS FOR
SELECT ROWNUM AS RN, A.*, B.USERNAME
FROM OBJECT A, USERSDETIAL B
WHERE A.OWNERID = B.DUSERSID
AND TRIM(A.TAGID) = VAR_FIRSTTAG
AND ROWNUM30;
END IF;
--tag游标
OPEN PRM_TAGS FOR
SELECT * FROM TABLE(CAST(INDEX_TAGS AS TABLE_TAG));
EXCEPTION
WHEN OTHERS THEN
PRM_APPCODE := PKG_COMM.DEF_ERR;
PRM_ERRMSG:= '获取主界面数据失败' || '错误原因:' || PRM_ERRMSG || '-' || SQLERRM ||
'错误行数:' || DBMS_UTILITY.FORMAT_ERROR_BACKTRACE();
END;
---注意:a.返回游标的用open for 方法 , 不用关心游标的关闭 。它是自动关闭的 。原因:调试把游标返回值点几下,你就回发现 。
b.如果报错CURSORIS CLOESD的话,说明游标里面没有数据 。所以open for 必须保证有select中有数据
c.嵌套表这里要用类似与java的构造方法写,如上
如果写成类似于java中new对象后,用set方法给嵌套表赋值的,会报错未能未能初始化的结果集 。
oracle 函数怎么返回游标forxin
select函数fromdual?。?
loop
....每条数据处理逻辑
end loop;
关于oracle怎么返回游标和oracle返回码大全的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。
推荐阅读
- 街机有机器人的格斗游戏,街机游戏有一种机器人射击的叫什么
- 个人银行小程序注册,小程序注册汇款银行找不到
- 为什么手机网页不能旋转,手机网页为什么不能横屏
- ai直播录屏,直播 录屏
- c语言编写回文数函数 c语言实现回文数
- 关注银行公众号不退出,银行公众号取消关注还能收到信息吗
- 利用html5制作迷宫,用html5制作小游戏
- 4399憨豆解谜游戏,憨豆的游戏
- mysql怎么用in语句 mysql语句in的用法