可以用REF CURSOR来实现,应该比较方便的。
具体可以搜索一下论坛,应该有的。
具体可以搜索一下论坛,应该有的。
解决方案 »
- oracle该不该存在这样的表?
- 存储过程问题
- 如何在ASP中向ORECLE数据库中的BLOB型字段中插入大文本(比如一万字的文章)??
- 有没有Oracle10g向Db2迁移乱码的解决办法?
- 如何比较日期
- 如何将SQL6.5中的数据库,完全移植到ORACLE8.1.7中去呢?高手请出手呀!!高分回报!!!
- 求一条语句同时在Oracle,Sql Server实现查询,见内
- sql server2000里的数据如何导入到oracle9i里呀
- 简单问题在存储过程中如何建临时表?
- 如何保持Oracle中两个结构一样的表的数据同步或一致
- ORACLE中有没有函数可修改调度时间,如得到当前的时间,能不能算出前15分钟的时间?怎么算,谢谢
- 不規則排序-謝謝大家,幫幫忙了!
cur ref_type_cursor;
rec cur_date%rowtype;
--上面是声明部分if 第一季度 then
open cur for
select * from tab1
elsif 第二季度 then
...
end if
loop
...
...
end loop;
这样就可以了啊。
c_GetOrder ref_type_cursor; -- Cursor c_GetOrder Is select distinct adorderid from adms_adcdr001 group by adorderid having count(distinct adorderid)>0;
v_OrderID Varchar(20);
begin
if(D_Func_Getorderdetailtab(i_Period)='001') then
open c_GetOrder for select distinct adorderid from adms_adcdr001 group by adorderid having count(distinct adorderid)>0;
elsif(D_Func_Getorderdetailtab(i_Period)='002') then
open c_GetOrder for select distinct adorderid from adms_adcdr002 group by adorderid having count(distinct adorderid)>0;
elsif(D_Func_Getorderdetailtab(i_Period)='003') then
open c_GetOrder for select distinct adorderid from adms_adcdr003 group by adorderid having count(distinct adorderid)>0;
elsif(D_Func_Getorderdetailtab(i_Period)='004') then
open c_GetOrder for select distinct adorderid from adms_adcdr004 group by adorderid having count(distinct adorderid)>0;
end if;
Fetch c_GetOrder Into v_OrderID;
Loop
If c_GetOrder%Found Then
D_Proc_OrderMonth(v_OrderID,i_Period);
Fetch c_GetOrder Into v_OrderID;
Elsif c_GetOrder%Notfound Then
Exit;
End If;
End Loop;
If c_GetOrder%Isopen Then Close c_GetOrder;
End If;
end D_Proc_ToOrderMonthBalance;legumer(纳豆人),我错在哪里?
行: 10
文本: open c_GetOrder for select distinct adorderid from adms_adcdr001 group by adorderid having count(distinct adorderid)>0;错误: PL/SQL: SQL Statement ignored
行: 10
文本: open c_GetOrder for select distinct adorderid from adms_adcdr001 group by adorderid having count(distinct adorderid)>0;错误: PLS-00382: expression is of wrong type
行: 12
文本: open c_GetOrder for select distinct adorderid from adms_adcdr002 group by adorderid having count(distinct adorderid)>0;错误: PL/SQL: SQL Statement ignored
行: 12
文本: open c_GetOrder for select distinct adorderid from adms_adcdr002 group by adorderid having count(distinct adorderid)>0;错误: PLS-00382: expression is of wrong type
行: 14
文本: open c_GetOrder for select distinct adorderid from adms_adcdr003 group by adorderid having count(distinct adorderid)>0;错误: PL/SQL: SQL Statement ignored
行: 14
文本: open c_GetOrder for select distinct adorderid from adms_adcdr003 group by adorderid having count(distinct adorderid)>0;错误: PLS-00382: expression is of wrong type
行: 16
文本: open c_GetOrder for select distinct adorderid from adms_adcdr004 group by adorderid having count(distinct adorderid)>0;错误: PL/SQL: SQL Statement ignored
行: 16
文本: open c_GetOrder for select distinct adorderid from adms_adcdr004 group by adorderid having count(distinct adorderid)>0;错误: PLS-00394: wrong number of values in the INTO list of a FETCH statement
行: 18错误: PL/SQL: SQL Statement ignored
行: 18错误: PLS-00394: wrong number of values in the INTO list of a FETCH statement
行: 22
文本: D_Proc_OrderMonth(v_OrderID,i_Period);错误: PL/SQL: SQL Statement ignored
行: 22
文本: D_Proc_OrderMonth(v_OrderID,i_Period);
行: 10
文本: open c_GetOrder for select distinct adorderid from adms_adcdr001 group by adorderid having count(distinct adorderid)>0;错误: PL/SQL: SQL Statement ignored
行: 10
文本: open c_GetOrder for select distinct adorderid from adms_adcdr001 group by adorderid having count(distinct adorderid)>0;错误: PLS-00382: expression is of wrong type
行: 12
文本: open c_GetOrder for select distinct adorderid from adms_adcdr002 group by adorderid having count(distinct adorderid)>0;错误: PL/SQL: SQL Statement ignored
行: 12
文本: open c_GetOrder for select distinct adorderid from adms_adcdr002 group by adorderid having count(distinct adorderid)>0;错误: PLS-00382: expression is of wrong type
行: 14
文本: open c_GetOrder for select distinct adorderid from adms_adcdr003 group by adorderid having count(distinct adorderid)>0;错误: PL/SQL: SQL Statement ignored
行: 14
文本: open c_GetOrder for select distinct adorderid from adms_adcdr003 group by adorderid having count(distinct adorderid)>0;错误: PLS-00382: expression is of wrong type
行: 16
文本: open c_GetOrder for select distinct adorderid from adms_adcdr004 group by adorderid having count(distinct adorderid)>0;错误: PL/SQL: SQL Statement ignored
行: 16
文本: open c_GetOrder for select distinct adorderid from adms_adcdr004 group by adorderid having count(distinct adorderid)>0;错误: PLS-00394: wrong number of values in the INTO list of a FETCH statement
行: 18错误: PL/SQL: SQL Statement ignored
行: 18错误: PLS-00394: wrong number of values in the INTO list of a FETCH statement
行: 22
文本: D_Proc_OrderMonth(v_OrderID,i_Period);错误: PL/SQL: SQL Statement ignored
行: 22
文本: D_Proc_OrderMonth(v_OrderID,i_Period);
REF CURSOR比较适合用于一个表的应该。像你这样的用了好多表的,你可以根据传入的参数,判断属于哪个季度的,打开游标
if i_Period='001' then
open...
close...
elsif i_Period='002' then
open..
close..
...
end if;
这样虽然写得比较多,还是蛮清楚的。:)
REF CURSOR比较适合用于一个表的应该。像你这样的用了好多表的,你可以根据传入的参数,判断属于哪个季度的,打开游标
if i_Period='001' then
open...
close...
elsif i_Period='002' then
open..
close..
...
end if;
这样虽然写得比较多,还是蛮清楚的。:)
不过我自己又有了一个其他的方法,你看对不对
create or replace procedure D_Proc_ToOrderMonthBalance(i_Period In Varchar) Is
begin
if(D_Func_Getorderdetailtab(i_Period)='001') then
for c_GetOrder in (select distinct adorderid from adms_adcdr001 where to_char(visittime,'yyyymm')=i_Period group by adorderid having count(distinct adorderid)>0 )
loop
D_Proc_OrderMonth(c_GetOrder.adorderid,i_Period);
end loop;
elsif(D_Func_Getorderdetailtab(i_Period)='002') then
for c_GetOrder in (select distinct adorderid from adms_adcdr002 where to_char(visittime,'yyyymm')=i_Period group by adorderid having count(distinct adorderid)>0)
loop
D_Proc_OrderMonth(c_GetOrder.adorderid,i_Period);
end loop;
elsif(D_Func_Getorderdetailtab(i_Period)='003') then
for c_GetOrder in (select distinct adorderid from adms_adcdr003 where to_char(visittime,'yyyymm')=i_Period group by adorderid having count(distinct adorderid)>0)
loop
D_Proc_OrderMonth(c_GetOrder.adorderid,i_Period);
end loop;
elsif(D_Func_Getorderdetailtab(i_Period)='004') then
for c_GetOrder in (select distinct adorderid from adms_adcdr004 where to_char(visittime,'yyyymm')=i_Period group by adorderid having count(distinct adorderid)>0)
loop
D_Proc_OrderMonth(c_GetOrder.adorderid,i_Period);
end loop;
end if;
end D_Proc_ToOrderMonthBalance;不管怎么讲,好像能行
赞同你的意见。正好学习一下。:)
Is
type c_GetOrder is ref cursor;
v_GetOrder c_GetOrder;
str varchar2(1000);
v_OrderID Varchar(20);
begin
str:='select distinct adorderid from decide('||i_period||',''1'',tab1,''2'',tab2,...) group by adorderid having count(distinct adorderid)>0';
open v_GetOrder for str;
loop
Fetch v_GetOrder Into v_OrderID;
exit when v_GetOrder%notfound;
D_Proc_OrderMonth(v_OrderID,i_Period);
End Loop;
Close v_GetOrder;
end D_Proc_ToOrderMonthBalance;
Is
type c_GetOrder is ref cursor;
v_GetOrder c_GetOrder;
str varchar2(1000);
v_OrderID Varchar(20);
v_Season varchar(3);
begin
v_Season:=d_Func_Getorderdetailtab(i_Period);--该函数是我决定用那个表的
str:='select distinct adorderid from decide('||v_Season||',''001'',adms_adcdr001,''002'',adms_adcdr002,''003'',adms_adcdr003,''004'',adms_adcdr004) group by adorderid having count(distinct adorderid)>0';
dbms_output.put_line(str);
open v_GetOrder for str;--该行出错了,错误代码:00933,SQL command not properly ended,自己不懂
loop
Fetch v_GetOrder Into v_OrderID;
exit when v_GetOrder%notfound;
D_Proc_OrderMonth(v_OrderID,i_Period);
End Loop;
Close v_GetOrder;
end D_Proc_ToOrderMonthBalance;传递的参数:i_Period=200403
str='select distinct adorderid from decide(001,'001',adms_adcdr001,'002',adms_adcdr002,'003',adms_adcdr003,'004',adms_adcdr004) group by adorderid having count(distinct adorderid)>0
';
decide()这个函数是怎么用的?我用过decode(),和他差不多吧,再过程中把 decide换成decode也不行,谢谢!
select distinct Workshop, MaterialID from Yl_fans_YarningOutSh, Yl_fans_YarningOutShDetails where Yl_fans_YarningOutSh.SheetID=Yl_fans_YarningOutShDetails.SheetID and DepotOutDate>=v_BeginDate and DepotOutDate<=v_EndDate and AuditFlag=1 union
select distinct Workshop, MaterialID from Yl_fans_YarningInSh, Yl_fans_YarningInShDetails where Yl_fans_YarningInSh.SheetID=Yl_fans_YarningInShDetails.SheetID and DepotInDate>=v_BeginDate and DepotInDate<=v_EndDate and AuditFlag=1 union
select distinct Workshop, MaterialID from Yl_fans_YarningWasteSh, Yl_fans_YarnWasteShDetails where Yl_fans_YarningWasteSh.SheetID=Yl_fans_YarnWasteShDetails.SheetID and SheetDate>=v_BeginDate and SheetDate<=v_EndDate and AuditFlag=1;
beckhambobo(beckham),早点出来解释一下,多谢了!jialin0626(新月冰蓝) 的方法肯定行了,但是还是想多学一点了,还是想学会beckhambobo(beckham)的方法
';
open v_GetOrder for str;--该行出错了,错误代码:00933,SQL command not properly ended,自己不懂
在 sqlplus中:
连接到:
Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.4.0 - ProductionSQL> select adorderid from decode(001,'001',adms_adcdr001,'002',adms_adcdr002,'0
03',adms_adcdr003,'004',adms_adcdr004);
select adorderid from decode(001,'001',adms_adcdr001,'002',adms_adcdr002,'003',a
dms_adcdr003,'004',adms_adcdr004)
*
ERROR 位于第 1 行:
ORA-00933: SQL command not properly ended