随笔-314  评论-209  文章-0  trackbacks-0

下面就是例子程序

 --明细表打印予处理  通用报表:
procedure mx_print_common(pd_id in mx_pd_syn.pd_id%type,
                   p_pd_mxb_id IN mx_pd_mxb_syn.p_mxb_id%type,
                   p_dept_no IN sc_mxk.dept_code%type,
                   p1 sc_bz_syn.bz_code%type,
                   p2 sc_cjjc_syn.cjjc_code%type,
                   p3 sc_mxk.warehouse_num%type)
is
  sql2 varchar2(500);             --存储查询语句
  sql3 varchar2(500);             --存储查询条件
  str1 sc_print_syn.a%type;   --存储车间进程
  str2 sc_print_syn.b%type;   --存储班组(工艺、工序)进程
  s_ip sc_print_syn.ip%type;
  type cursor_type is ref cursor;
  c1 cursor_type;
  type record_type is record(
        pbom_id sc_mxk.pbom_id%type
  );
  r_c1 record_type;
 /*

注意上面红色的两行和蓝色的两行

红色的两行定义一个游标

蓝色的两行定义一个游标中将要返回的数据的数据结构

*/
      
    cursor c2(p_pbom_id sc_mxk.pbom_id%type) is
        select a.dd_count,b.gx_name,c.bz_name,d.cjjc_name
         from sc_p_gx_syn a,sc_gx_syn b,sc_bz_syn c,sc_cjjc_syn d
          where pbom_id = p_pbom_id
          and a.gx_code=b.gx_code(+) and b.dept_code=p_dept_no
          and a.bz_code=c.bz_code(+)  and b.dept_code=p_dept_no
          and a.cjjc_code=d.cjjc_code(+)  and b.dept_code=p_dept_no;
   
    r_c2 c2%rowtype;
BEGIN
      s_ip :=sys_context('USERENV','IP_ADDRESS');
      delete from sc_print_syn where ip=s_ip and p_id=pd_id;
      commit;
     --下面开始构造查询语句
      sql2:='select distinct a.pbom_id from sc_mxk a';
      sql3:=' where a.p_id=' || pd_id || ' and a.dept_code= ''' || p_dept_no || '''';
  
      if  p_pd_mxb_id >0 then
         sql2:=sql3 || ',mxk c ';
         sql3:=sql3 || ' and c.m_mxb_id= ' || p_pd_mxb_id || ' and a.mxb_id = c.mxb_id';
      end if;
     
      if p1 is not null then
         sql2:=sql2 || ',sc_p_gx_syn b';
         sql3:=sql3 || ' and a.pbom_id=b.pbom_id  and b.bz_code = ''' || p1 || '''';
      end if;
      if p2 is not null then
         sql2:=sql2 || ',sc_p_gx_syn b';
         sql3:=sql3 || ' and a.pbom_id=b.pbom_id  and b.cjjc_code = '''  || p2 || '''';
      end if;
      if p3 is not null then
         sql3:=sql3 || ' and a.warehouse_num = ''' || p3 || '''';
      end if;
      sql2:=sql2 || sql3;

--打开动态游标,再往下就都一样了
      open c1 for sql2;
        loop
            fetch c1 into r_c1;
            exit when c1%notfound;
            str1:='';
            str2:='';
            --打开工序表进行处理
            open c2(r_c1.pbom_id);
            loop              
                fetch c2 into r_c2;
                exit when c2%notfound; --没有记录退出
                if r_c2.cjjc_name is not null then
                   str1 :=str1 || to_char(r_c2.cjjc_name);
                end if;
                if r_c2.bz_name is not null then
                   str2 := str2  || r_c2.bz_name  ||  to_char(r_c2.dd_count);
                elsif r_c2.gx_name is not null then
                   str2 := str2  || to_char(r_c2.gx_name)  ||  to_char(r_c2.dd_count);
                end if;
       
                
            end loop;
            close c2;
            insert into sc_print_syn(a,b,ip,p_id,r_id)
               values(str1,str2,s_ip,pd_id,r_c1.pbom_id);
                  COMMIT;
        end loop;
        close c1;
END mx_print_common;

当然,实现的方法一定很多,甚至可以用隐式游标。但是隐式游标中用动态查询语句也要费一些周折的。

   作者:Northsnow
电子邮件:northsnow@163.com
blog:http://blog.csdn.net/precipitant

posted on 2008-05-27 09:17 xzc 阅读(10519) 评论(3)  编辑  收藏 所属分类: Oracle

评论:
# re: oracle动态游标的简单实现方法 2008-05-27 09:18 | xzc
----定义
type cursor_type is ref cursor;
c1 cursor_type;
----使用
--打开动态游标,再往下就都一样了
open c1 for sql2;
loop
fetch c1 into r_c1;
exit when c1%notfound;   回复  更多评论
  
# re: oracle动态游标的简单实现方法 [未登录] 2008-05-27 11:43 | xzc
TYPE cursor_type IS REF CURSOR;
c1 cursor_type;
--
OPEN c1 FOR lc_sql;
LOOP
FETCH c1
INTO lc_source_column_pk_value, lc_source_column_npk_value;
EXIT WHEN c1%NOTFOUND;
null;
END LOOP;
<<ERROREND>>
CLOSE c1;  回复  更多评论
  
# re: oracle动态游标的简单实现方法 [未登录] 2008-05-30 19:32 | xzc
DECLARE
v_cursor NUMBER;
v_stat NUMBER;
v_row NUMBER;
v_id NUMBER;
v_no VARCHAR(100);
v_date DATE;
v_sql VARCHAR(200);
s_id NUMBER;
s_date DATE;
BEGIN
s_id := 3000;
s_date := SYSDATE;
v_sql := 'SELECT id,qan_no,sample_date FROM "tblno" WHERE id > :sid and sample_date < :sdate';
v_cursor := dbms_sql.open_cursor; --打开游标;
dbms_sql.parse(v_cursor, v_sql, dbms_sql.native); --解析动态SQL语句;
dbms_sql.bind_variable(v_cursor, ':sid', s_id); --绑定输入参数;
dbms_sql.bind_variable(v_cursor, ':sdate', s_date);

dbms_sql.define_column(v_cursor, 1, v_id); --定义列
dbms_sql.define_column(v_cursor, 2, v_no, 100);
dbms_sql.define_column(v_cursor, 3, v_date);
v_stat := dbms_sql.execute(v_cursor); --执行动态SQL语句。
LOOP
EXIT WHEN dbms_sql.fetch_rows(v_cursor)<=0; --fetch_rows在结果集中移动游标,如果未抵达末尾,返回1。
dbms_sql.column_value(v_cursor, 1, v_id); --将当前行的查询结果写入上面定义的列中。
dbms_sql.column_value(v_cursor, 2, v_no);
dbms_sql.column_value(v_cursor, 3, v_date);
dbms_output.put_line(v_id || ';' || v_no || ';' || v_date);
END LOOP;
dbms_sql.close_cursor(v_cursor); --关闭游标。
END;



  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: