求oracle高手,存储过程中取游标值时,出现数据类型不一致问题,急急

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求oracle高手,存储过程中取游标值时,出现数据类型不一致问题,急急相关的知识,希望对你有一定的参考价值。

我自定义了一个自定义数据类型emp_rec
create or replace type emp_rec as object
(
item1 number ,
item2 number
)
定义了一个存储过程
create or replace procedure test is
v_sql varchar2(100);
TYPE EmpCurTyp IS REF CURSOR;
emp_cv EmpCurTyp;
emp emp_rec;
begin

v_sql:='select sum(tt) item1,sum(bb) item2 from table1';
open emp_cv for v_sql;
loop

fetch emp_cv into emp;
EXIT WHEN emp_cv%NOTFOUND;
begin
dbms_output.put_line(emp.item1);
end;
end test;

运行报数据类型不一致,应为-,但却获得-

游标返回类型应该定义为 emp table1%rowtype;
然后再fetch emp_cv into emp;

对象类型在这里不能直接赋值,你也可以使用一个复合类型去定义变量比如:
create or replace type emp_rec is record
(
item1 number,
item2 number
);
emp emp_rec;
然后 再fetch emp_cv into emp; 这里变量顺序必须与游标字段顺序一致;追问

怎么定义复合类型 ,直接is recode 报错了。

追答

是 is record

参考技术A

个人觉得

 

    自定义类型就不能这么用吧,你说,下面的sql能对吗?

 

select sum(tt) item1,sum(bb) item2 into emp

from (select 1 tt,2 bb from dual) table1;

 

2.      你的 end loop 呢?

追问

有的 忘记写上去了,我的业务逻辑比较复杂,所以写了一个简单版的表达一下这个意思 ,该怎么解决这个问题呢?我想通过open 弱游标来获取sql的值,然后在通过Loop 来获取游标内部的值,怎么获取呢

追答

你直接定义2个变量去取值呢?

declare 里面:
item1 number;
item2 number;

loop 里面:

fetch emp_cv into item1,item2;

参考技术B 你表里数据是number 存储过程里边用的是varchar 统一一下数据的类型追问

sum 返回的是varchar?

追答

你sum返回的可能是数吧
但是你前边不是定义了 v_sql是varchar吗 把数字型赋值给字符型了

oracle 存储过程循环插入数据不定时出现卡死,求高手指点,循环过程如下:

WHILE to_char(v_looptime,'yyyy-MM-dd') <= v_loopenddate
LOOP
--- 日发生额
v_eyerydate := to_char(v_looptime,'yyyy-MM-dd');
insert into gl_dailybalancetemp(creditamount,creditquantity,debitamount,debitquantity,fraccreditamount,fracdebitamount,localcreditamount,localdebitamount,pk_accchart,pk_accasoa,pk_accountingbook,deverydate,year,period,pk_currtype)
select tempb.creditamount,tempb.creditquantity,tempb.debitamount,tempb.debitquantity,
tempb.fraccreditamount,tempb.fracdebitamount,tempb.localcreditamount,tempb.localdebitamount,
tempb.pk_accchart,tempb.pk_accasoa,tempb.pk_accountingbook,tempb.eyerydate,tempb.year,tempb.period,tempb.pk_currtype
from
(
select pk_accountingbook,pk_accchart,pk_accasoa from gl_dailybalancevoucher where deverydate<= '' || v_eyerydate || ''
group by pk_accountingbook,pk_accchart,pk_accasoa
) tempa
inner join
(
select sum(b.creditamount) creditamount,sum(b.creditquantity) creditquantity,sum(b.debitamount) debitamount,sum(b.debitquantity) debitquantity,
sum(b.fraccreditamount) fraccreditamount,sum(b.fracdebitamount) fracdebitamount,sum(b.localcreditamount) localcreditamount,sum(b.localdebitamount) localdebitamount,
b.pk_accchart,b.pk_accasoa,a.pk_accountingbook,v_eyerydate eyerydate,substr(min(a.year|| '-' ||a.period),0,4) year,substr(min(a.year|| '-' ||a.period),6,2) period,max(b.pk_currtype) pk_currtype
from gl_voucher a inner join gl_detail b on a.pk_voucher=b.pk_voucher
where nvl(a.dr,0)=0 and nvl(b.dr,0)=0 and a.year !='0000' and a.period !='00' and a.prepareddate >= ''|| v_startdate||'' and a.prepareddate<= ''|| v_eyerydate||''
and a.pk_accountingbook in(select pk_accountingbook from gl_dailybalancevoucher where substr(deverydate,0,4)=''|| v_startyear || '')
and b.pk_accasoa in(select pk_accasoa from gl_dailybalancevoucher where substr(deverydate,0,4)=''|| v_startyear || '')
group by a.pk_accountingbook,b.pk_accchart,b.pk_accasoa
)tempb on tempa.pk_accountingbook=tempb.pk_accountingbook and tempa.pk_accasoa=tempb.pk_accasoa;
commit;

v_looptime := v_looptime+1;
END LOOP;
按照日循环,原表数据稳定,没变化,但是偶尔循环能执行过去,大部分情况下就不定时的卡到哪个日期过不去。

参考技术A 感觉对日期的处理问题,你将日期类型转换为字符串类型再比较,这里不建议转,直接比较吧。

以上是关于求oracle高手,存储过程中取游标值时,出现数据类型不一致问题,急急的主要内容,如果未能解决你的问题,请参考以下文章

oracle存储过程中参数datatable如何接收,求高手!

oracle带参数的存储过程,一直提示sql无效sql语句。求高手指点

oracle 存储过程 执行、调用不成功 求高手指导?

oracle 随机生成12位不重复数据,求高手写个存储过程。高分!!!

在.net 中使用EF 连接oracle 数据库,如何使用存储过程。求高手指点,help!

求两个oracle存储过程例子