`

oracle动态游标的简单实现方法

阅读更多

下面就是例子程序

 --明细表打印予处理  通用报表:
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

分享到:
评论

相关推荐

    数据库嵌入式SQL介绍与应用

    2.4.2 动态游标 20 2.4.3 SQLDA 23 2.4.4 DESCRIBE语句 27 2.5 两个例子程序 27 2.5.1 TELECOM程序 27 2.5.2 ADHOC程序 29 第三节 IBM DB2嵌入SQL语言 35 3.1 一个简单示例 35 3.2 嵌入SQL语句 37 3.2.1宿主变量 37 ...

    Oracle11g从入门到精通2

    《Oracle11g从入门到精通》面向数据库管理人员和数据库开发人员,从实际角度出发,系统地介绍了数据库和Oracle的相关概念和原理、Oracle的数据库管理(如安装与启动,用户权限、备份与恢复等),以及Oracle的应用...

    使用简单的SQL语句实现的Oracle数据库分页技术

    它没有使用PL/SQL语句(比如什么程序包、游标等),只是使用通用的、简单的SQL实现了数据库分页动作。 只要看懂了分页公式,那么这是一个通用的Oracle数据库分页动作(可以使用PHP, JAVA, ASP .NET等其他语言)。 ...

    Oracle11g从入门到精通

    《Oracle11g从入门到精通》面向数据库管理人员和数据库开发人员,从实际角度出发,系统地介绍了数据库和Oracle的相关概念和原理、Oracle的数据库管理(如安装与启动,用户权限、备份与恢复等),以及Oracle的应用...

    Oracle.11g.从入门到精通 (2/2)

    3.3.1 简单查询 3.3.2 WHERE子句 3.3.3 ORDER BY子句 3.3.4 GROUPBY子句 3.3.5 HAVING子句 3.3.6 多表连接查询 3.3.7 集合操作 3.3.8 子查询 3.4 数据操纵 3.4.1 INSERT语句 3.4.2 UPDATE语句 3.4.3 DELETE语句 ...

    Oracle.11g.从入门到精通 (1/2)

    3.3.1 简单查询 3.3.2 WHERE子句 3.3.3 ORDER BY子句 3.3.4 GROUPBY子句 3.3.5 HAVING子句 3.3.6 多表连接查询 3.3.7 集合操作 3.3.8 子查询 3.4 数据操纵 3.4.1 INSERT语句 3.4.2 UPDATE语句 3.4.3 DELETE语句 ...

    Oracle Database 11g初学者指南--详细书签版

     Ian Abramson是IOUG(Independent Oracle Users Group)现任总裁,现居加拿大多伦多,他是业界资深技术顾问,为电信、CRM、公用事业和其他行业的客户提供实现方案的专业指导。他的关注方向包括Oracle产品集,以及...

    sql总结.doc

    (2)Mysql中搜索引擎Innodb(聚簇索引)和Mysiam(非聚簇索引)都采用B+,oracle也采用B+树实现 注:聚簇索引:一张表只能建立一个聚簇索引,以主键建立索引。聚簇索引包括主键索引和二级索引(二级索引是在对非主键...

    Oracle优化53解

    你可以采用基于ROWID的访问方式情况,提高访问表的效率, ROWID包含了表中记录的物理位置信息……ORACLE采用索引(INDEX)实现了数据和存放数据的物理位置(ROWID)之间的联系。 通常索引提供了快速访问ROWID的方法...

    oracle实验报告

    (1) 了解Oracle的工作环境和基本使用方法。 (2) 练习标准SQL的数据操作,查询命令及其查询优化。 (3) 学会使用高级SQL命令,排序、分组、自连接查询等。 (4) 学会使用SQL*PLUS命令显示报表,存储到文件等。 【实验...

    oracle教案(doc)+SQL Reference 10g(chm).rar

    7.9.4 Oracle游标的类型? 114 7.9.5 使用游标 114 7.10 存储过程 114 7.10.1 存储过程的基本概念 114 7.10.2 存储过程的建立及执行 114 7.10.3 调用存储过程的方法 114 7.10.4 带参数的存储过程 114 7.10.5 删除...

    Oracle语句优化30个规则详解

     你可以采用基于ROWID的访问方式情况,提高访问表的效率, ROWID包含了表中记录的物理位置信息……ORACLE采用索引(INDEX)实现了数据和存放数据的物理位置(ROWID)之间的联系。通常索引提供了快速访问ROWID的方法,...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    oracle建议用户自己设计数据库管理和安全的权限规划,而不要简单的使用这些预定角色。将来的版本中这些角色可能不会作为预定义角色。  DELETE_CATALOG_ROLE, EXECUTE_CATALOG_ROLE,SELECT_CATALOG_ROLE这些角色...

    ORACLE SQL性能优化系列

    你可以采用基于ROWID的访问方式情况,提高访问表的效率, , ROWID包含了表中记录的物理位置信息..ORACLE采用索引(INDEX)实现了数据和存放数据的物理位置(ROWID)之间的联系. 通常索引提供了快速访问ROWID的方法,因此...

    精通SQL 结构化查询语言详解

    《精通SQ:结构化查询语言详解》全面讲解SQL语言,提供317个典型应用,读者可以随查随用,针对SQL Server和Oracle进行讲解,很有代表性。 全书共包括大小实例317个,突出了速学速查的特色。《精通SQ:结构化查询语言...

    Oracle P/L SQL实现发送Email、浏览网页等网络操作功能

    --动态游标 --Purpose : 获得汉字拼音编码 Type ut_PYIndex_191_List is Varray( 191 ) OF Number; Type ut_PYIndex_List is Varray( 10 ) OF ut_PYIndex_191_List; is_OracleDirectory Constant ...

    精通sql结构化查询语句

    以SQL Server为工具,讲解SQL语言的应用,提供了近500个曲型应用,读者可以随查随用,深入讲解SQL语言的各种查询语句,详细介绍数据库设计及管理,详细讲解存储过程、解发器和游标等知识,讲解了SQL语言在高级语言中...

    ORACLE之常用FAQ V1.0(整理)

    [Q]怎么样利用游标更新数据 4 [Q]怎样自定义异常 4 [Q]十进制与十六进制的转换 4 [Q]怎么样抽取重复记录 5 [Q]怎么样设置自治事务 5 [Q]怎么样在过程中暂停指定时间 5 [Q]怎么样快速计算事务的时间与日志量 5 [Q]...

Global site tag (gtag.js) - Google Analytics