资源描述:
《oracle动态游标的简单实现方法》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、oracle动态游标的简单实现方法[转]2008年07月30日星期三08:46--明细表打印予处理通用报表:proceduremx_print_common(pd_idinmx_pd_syn.pd_id%type,p_pd_mxb_idINmx_pd_mxb_syn.p_mxb_id%type,p_dept_noINsc_mxk.dept_code%type,p1sc_bz_syn.bz_code%type,p2sc_cjjc_syn.cjjc_code%type,p3sc_mxk.warehouse_num%type)issql2varchar2(500);--存储查询语句sql3varc
2、har2(500);--存储查询条件str1sc_print_syn.a%type;--存储车间进程str2sc_print_syn.b%type;--存储班组(工艺、工序)进程s_ipsc_print_syn.ip%type;typecursor_typeisrefcursor;c1cursor_type;typerecord_typeisrecord(pbom_idsc_mxk.pbom_id%type);r_c1record_type;/*注意上面红色的两行和蓝色的两行红色的两行定义一个游标蓝色的两行定义一个游标中将要返回的数据的数据结构*/cursorc2(p_pbom_idsc_m
3、xk.pbom_id%type)isselecta.dd_count,b.gx_name,c.bz_name,d.cjjc_namefromsc_p_gx_syna,sc_gx_synb,sc_bz_sync,sc_cjjc_syndwherepbom_id=p_pbom_idanda.gx_code=b.gx_code(+)andb.dept_code=p_dept_noanda.bz_code=c.bz_code(+)andb.dept_code=p_dept_noanda.cjjc_code=d.cjjc_code(+)andb.dept_code=p_dept_no;r_c2c2%r
4、owtype;BEGINs_ip:=sys_context('USERENV','IP_ADDRESS');deletefromsc_print_synwhereip=s_ipandp_id=pd_id;commit;--下面开始构造查询语句sql2:='selectdistincta.pbom_idfromsc_mxka';sql3:='wherea.p_id='
5、
6、pd_id
7、
8、'anda.dept_code='''
9、
10、p_dept_no
11、
12、'''';ifp_pd_mxb_id>0thensql2:=sql3
13、
14、',mxkc';sql3:=sql3
15、
16、'andc.m_mxb_id='
17、
18、
19、p_pd_mxb_id
20、
21、'anda.mxb_id=c.mxb_id';endif;ifp1isnotnullthensql2:=sql2
22、
23、',sc_p_gx_synb';sql3:=sql3
24、
25、'anda.pbom_id=b.pbom_idandb.bz_code='''
26、
27、p1
28、
29、'''';endif;ifp2isnotnullthensql2:=sql2
30、
31、',sc_p_gx_synb';sql3:=sql3
32、
33、'anda.pbom_id=b.pbom_idandb.cjjc_code='''
34、
35、p2
36、
37、'''';endif;ifp3isnotnullthensql3:=sql3
38、
39、
40、'anda.warehouse_num='''
41、
42、p3
43、
44、'''';endif;sql2:=sql2
45、
46、sql3;--打开动态游标,再往下就都一样了openc1forsql2;loopfetchc1intor_c1;exitwhenc1%notfound;str1:='';str2:='';--打开工序表进行处理openc2(r_c1.pbom_id);loopfetchc2intor_c2;exitwhenc2%notfound;--没有记录退出ifr_c2.cjjc_nameisnotnullthenstr1:=str1
47、
48、to_char(r_c2.cjjc_name);endif;if
49、r_c2.bz_nameisnotnullthenstr2:=str2
50、
51、r_c2.bz_name
52、
53、to_char(r_c2.dd_count);elsifr_c2.gx_nameisnotnullthenstr2:=str2
54、
55、to_char(r_c2.gx_name)
56、
57、to_char(r_c2.dd_count);endif;endloop;closec2;insertintosc_print_syn