问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
你好,欢迎来到懂视!登录注册
当前位置: 首页 - 正文

oracle 游标问题

发布网友 发布时间:2022-04-07 22:14

我来回答

5个回答

懂视网 时间:2022-04-08 02:35

//属性 
//cus1%found cus1%notfound cus1%isopen cus1%rowcount影响行数
SET serveroutput ON;
DECLARE
 CURSOR c1
 IS
 SELECT bookno,booktitle FROM bebook;
 bookno bebook.bookno%type;//引用类型
 booktitle bebook.booktitle%type;
 rowbook bebook%rowtype;//行引用类型
BEGIN
 OPEN c1;
 LOOP
 FETCH c1 INTO bookno,booktitle;
 EXIT
 WHEN c1 %notfound;
 dbms_output.put_line(‘this string breaks here.‘||bookno||booktitle);
 END LOOP;
END;

//带参数的光标
 Cursor 
 cemp(dno number) is select ename from emp where deptno = dno; 
 Open cemp(10);

2. rowtype
利用这个数据类型增加程序的健壮性。不会受到表结构更改导致程序更改。
记录可以整体赋值
rowtype参考
rowtype参考

//读入数据到rowtype类型中
create table testtable();
r testtable%rowtype;
select * into r from testtable where pno=...;
//rowtype类型数据插入表中
insert into testtable2 values r;
-----------------------------------------------------
-----------------------------------------------------
declare
 v_dept dept%rowtype;
begin
 v_dept.deptno := 60;
 v_dept.dname := ‘sample‘;
 v_dept.loc := ‘chicago‘;
 insert into dept values v_dept;
end;
declare
 v_dept dept%rowtype;
begin
 v_dept.deptno := 60;
 v_dept.dname := ‘sample2‘;
 v_dept.loc := ‘dallas‘;
 update dept set ROW=v_dept where deptno=v_dept.deptno;
end;

declare
 rwEmp t_mst_employee%rowtype;
begin
 select * into rwEmp from t_mst_employee where emp_no=‘10001‘;
 rwEmp.emp_no := ‘20001‘;

 insert into t_mst_employee values rwEmp;
 update t_mst_employee set ROW=rwEmp where emp_no=‘3900‘;
end;

3. 过程

create or replace PROCEDURE "STATISTICS_ORDERSUMxxx"(
 branchNo BEbranch.branchNo%type,
 reportPerson VARCHAR2,
 ordersum_table_cursor OUT sys_refcursor)
IS
 testcur sys_refcursor;
 v_typegoodNo BEproduct.productClass%TYPE; --类别编号
 v_pritypegoodNo BEproduct.productClass%TYPE; --上一游标读取的类别编号
 v_branchNo BEbranch.branchNo%TYPE;  --游标读取的分店编号
 v_pribranchNo BEbranch.branchNo%TYPE; --上一个游标读取的分店编号
 v_branchname BEbranch.branchName%type; --各分店
 v_branchsum NUMBER;    --分店总数
 v_typenum NUMBER;

 ordersum_table odreport1%rowtype;
 --游标定义
 CURSOR ordersum_cur(pno VARCHAR2)
 IS
 SELECT d.typegoodno,
 SUM(b.quantity)
 FROM BDprocureplan a,
 BDplandetail b,
 BEproduct c,
 DTtypegood d
 WHERE a.branchno =pno
 AND a.planno = b.planno
 AND b.productno = c.productno
 AND c.productclass = d.typegoodno
 GROUP BY d.typegoodno;
 CURSOR branch_cur
 IS
 SELECT branchNo,branchName FROM BEbranch;
 maketime DATE;
 mycount INT:=0;
BEGIN
 SELECT COUNT(*) INTO mycount FROM bebranch;
 OPEN branch_cur;
 LOOP
 FETCH branch_cur INTO v_branchNo,v_branchname;
 EXIT
 WHEN branch_cur%NOTFOUND;
 ordersum_table.branchname := v_branchname;
 ordersum_table.branchno := v_branchno;
 dbms_output.put_line(ordersum_table.branchname);
 OPEN ordersum_cur( v_branchNo );
 LOOP
 FETCH ordersum_cur INTO v_typegoodNo,v_typenum;
 EXIT
 WHEN ordersum_cur%NOTFOUND;
  CASE v_typegoodNo
 WHEN‘001‘THEN 
 ordersum_table.clothessum := ordersum_table.clothessum+v_typenum;
 WHEN‘002‘THEN
 ordersum_table.shoesum:=ordersum_table.shoesum+v_typenum;
 WHEN‘003‘THEN
 ordersum_table.foodsum:=ordersum_table.foodsum+v_typenum;
 WHEN‘004‘THEN
 ordersum_table.sourcesum:=ordersum_table.sourcesum+v_typenum;
 WHEN‘005‘THEN
 ordersum_table.drinksum:=ordersum_table.drinksum+v_typenum;
 WHEN‘006‘THEN
 ordersum_table.drinkingsum:=ordersum_table.drinkingsum+v_typenum;
 WHEN‘007‘THEN
 ordersum_table.vegetablesum:=ordersum_table.vegetablesum+v_typenum;
 WHEN‘008‘THEN
 ordersum_table.fruitsum:=ordersum_table.fruitsum+v_typenum;
 WHEN‘009‘THEN
 ordersum_table.moatsum:=ordersum_table.moatsum+v_typenum;
 WHEN‘010‘THEN
 ordersum_table.electricsum:=ordersum_table.electricsum+v_typenum;
 WHEN‘011‘THEN
 ordersum_table.officesum:=ordersum_table.officesum+v_typenum;
 WHEN‘012‘THEN
 ordersum_table.studysum:=ordersum_table.studysum+v_typenum;
 WHEN‘013‘THEN
 ordersum_table.diansum:=ordersum_table.diansum+v_typenum;
 END CASE;
 ordersum_table.allsum := ordersum_table.allsum+v_typenum;
 END LOOP;
 insert into odreport1 values ordersum_table;
 CLOSE ordersum_cur;
 END LOOP;
 CLOSE branch_cur;
 COMMIT;
END "STATISTICS_ORDERSUMxxx";

Java中调用

//获取
CallableStatement cstmt = null;
String sAutoNo = null;
String sSql = "{call AUTO_No(?,?)}";
try {
 cstmt = connDB.getConn().prepareCall(sSql);
 cstmt.setString(1, tableName);
 cstmt.registerOutParameter(2,oracle.jdbc.OracleTypes.VARCHAR); //注册字符变量
 cstmt.registerOutParameter(2,oracle.jdbc.OracleTypes.CURSOR);//注册游标变量
 cstmt.execute();
 sAutoNo = cstmt.getString(2);//cstmt.getInt(2);
 ResultSet rs = ((OracleCallableStatement)call).getCursor(2);
while(rs.next()){
 //do something
}

Oracle游标、过程与引用类型

标签:游标   oracle11g   

热心网友 时间:2022-04-07 23:43

rs p_cur%rowtype; -- 定义rs

create or replace procere P_addOrder(cartId varchar2,
memberId varchar2,
addressId number) is
plSql varchar2(2000);
p_cur sys_refcursor;

rs p_cur%rowtype; -- 定义rs

begin
plSql := 'SELECT
s.CartId,
s.proctid,
s.qty,
p.Reserves,
p.proctName,
p.status,
p.IsActivity,
p.ACTIVITY
FROM
MG_SHOPCART s
LEFT JOIN
MG_Proct@to_msp p ON s.proctid = p.proctid
WHERE CartID in (' || cartId || ')';
open p_cur for plSql;
loop
fetch p_cur
into rs; --这个rs怎样定义
exit when p_cur%notfound;
dbms_output.put_line(rs.cartId);
end loop;
close p_cur;

commit;
end;追问这个已经试过,报错

错误:PLS-00320: 此表达式的类型声明不完整或格式不正确

追答给你copy一段参考一下:

SQL> declare
2 type gsm_rec is record(
3 gsmno varchar2(11),
4 status varchar2(1),
5 price number(8,2));
6
7 type app_ref_cur_type is ref cursor return gsm_rec;
8 my_cur app_ref_cur_type;
9 my_rec gsm_rec;
10
11 begin
12 open my_cur for select gsmno,status,price
13 from gsm_resource
14 where store_id='SD.JN.01';
15 fetch my_cur into my_rec;
16 while my_cur%found loop
17 dbms_output.put_line(my_rec.gsmno||'#'||my_rec.status||'#'||my_rec.price);
18 fetch my_cur into my_rec;
19 end loop;
20 close my_cur;
21 end;
22 /

热心网友 时间:2022-04-08 01:01

在存储过程里面要想访问引用游标的当前行的字段属性,
需要自行定义RECORD类型、严格映射,
除非你游标里取得是单表、全字段,才能用像静态游标的rowtype来定义记录变量追问要怎样映射字段

追答就是“名称、类型、顺序”都要跟游标sql里from前面的对应

热心网友 时间:2022-04-08 02:36

你为啥要这样写,换个写法不就得了。。。 这个不是一般作为输出游标的 吗追问动态sql 多表 游标循环

热心网友 时间:2022-04-08 04:27

rs 可以用多个变量来定义的
声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com
第十一题a选项,我不明白,取交集该咋取? 求第十一题的解题步骤~ 想知道为什么第十一题为什么是A?为什么我算出来的是B? 榨汁机榨出的果汁有沫儿怎么处理 榨苹果汁需要加水吗,苹果汁为什么会有泡沫 【打果汁有泡沫怎么办】如何打果汁不起沫 榨果汁有泡沫怎么处理 一战和二战的时间是多少 保健医苑刊物简介 梦见拥抱伤心人的预兆 百万医疗险心脏支架赔吗? 视频号粉丝牌3级如何解锁 西瓜视频粉丝等级怎么分的 粉丝的六个级别分别是什么? 我是特种兵中那个教官戴的军帽是什么帽子 绿色贝蕾帽是什么 我是特种兵他们戴的帽子叫什么名字 我是特种兵之利刃出鞘第13集里带的帽子是? 我是特种兵里的帽子 特种兵头上带的头巾有什么作用?带的圆边帽有什么作用? 我是特种兵帽子 很想知道现在的特种兵头上带的是什么帽子 特种兵戴的帽子叫什么名字? 特种部队戴的是什么帽子是贝勒帽吗? 特种兵和狙击手在执行任务时都戴什么帽子? 黑色的纯棉衣服掉色了怎样才能使衣服回复原来的黑色 很容易晕车的,有啥好办法。 小米辣是蔬菜吗 你见过口味最清淡的人到底有多淡? 全自动洗衣机设置错了怎么停止重新开始 天气热了吃什么好? iphone5home键失灵怎么强制重启 iPhone5锁屏键和home键都失灵了,现在应该怎样开机? 苹果iPhone5电源键坏了 不用电源键怎么开机? 苹果5手机开机键坏了有几种方法开机 任务栏被删怎么恢复啊?、 把任务栏的显示桌面的图标删除了怎么恢复 win7任务栏文件快捷方式被删除如何恢复 删除了任务栏里的“显示桌面”,要怎么找回呀? 西铁城光动能手表如何恢复出厂设置 ipad买无线局域网还是买蜂窝 大盘秒针不复原到0位置该怎么办.西铁城光动能手表 为什么蜂窝版比无线版发售晚 西铁城光动能手表没电停止走后,充了一点电后,时间还是没法校对,按键A和拔表栓都没有反应 iPod无限局域网和加蜂窝网络机型有什么区别 西铁城光动能手表秒针可以设置成停止状态么? 西铁城光动能手表星期几指针错位,星期天星期一指针不指,直接星期二了 玉米怎么去皮给宝宝吃 学软件开发的话需要学习哪些软件呢? 如何在PL/SQL developer中查看所连接的oracle的版本 如何查看oracle数据库的版本
  • 焦点

最新推荐

猜你喜欢

热门推荐