CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Oracle >  开发

Oracle 存储过程

楼主SZJAVA(chen)2005-04-19 15:17:45 在 Oracle / 开发 提问

我想做一个这样的存储过程,用游标的形式返回结果集,一般的游标反回结果集我会,我现在的问题是:  
   
  我传进来的参数正好是存储过程里SQL的条件名,在where后面的三个必要条件都是传进来的参数,如这样的  
   
        select   intareaid,strareacode,strareaname    
        from   base_area    
        where   ZDName(传进来的)   =(条件运算符传进来)   qing(条件结果也是传进来的)  
   
  请教高手在oracle实现这一功能呢?先谢谢你们啦!  
   
  不会的,也帮我顶一下!!!  
   
  谢谢各位  
  问题点数:20、回复次数:9Top

1 楼baojianjun(包子)回复于 2005-04-19 15:33:16 得分 20

使用動態SQL語句就可以解決了  
   
  ...............  
        sqltxt:=   'select   intareaid,strareacode,strareaname   into   is_a,is_b,is_c   where   ';  
        sqltxt:=   sqltxt||'zdname'||'condition'||'''qing'''   ';  
        execute   immediate   sqltxt   ;  
  ..............Top

2 楼baojianjun(包子)回复于 2005-04-19 15:37:46 得分 0

不好意思   修改一下  
        sqltxt:=   'select   intareaid,strareacode,strareaname   into   is_a,is_b,is_c     ';  
        sqltxt:=   sqltxt||'   where   '||zdname||condition||'''qing'''   ;  
        execute   immediate   sqltxt   ;  
   
  Top

3 楼SZJAVA(chen)回复于 2005-04-19 15:46:27 得分 0

谢谢   baojianjun(包子)   ,但你这样返回的结果只是一条记录,但要实现返回一个结果集怎么办呢?  
  我现在做的是定义一个包,用游标的形式返回。Top

4 楼baojianjun(包子)回复于 2005-04-19 16:01:44 得分 0

使用一個臨時表吧  
  create   or   replace   table   xxxx_temp(a   [type],b   [type],   c   [type]);  
   
  sqltxt:=   'insert   into   xxxx_temp   (a,b,c)   select   intareaid,strareacode,strareaname       ';  
        sqltxt:=   sqltxt||'   where   '||zdname||condition||'''qing'''   ;  
        execute   immediate   sqltxt   ;  
  Top

5 楼SZJAVA(chen)回复于 2005-04-19 16:20:53 得分 0

谢谢,但是不行,你能不能给一个例子给我呢?谢谢!!  
   
  Top

6 楼baojianjun(包子)回复于 2005-04-19 16:40:51 得分 0

--example  
  --我的一個   存儲過程中的一段代碼  
  CREATE   OR   REPLACE   PROCEDURE   CM_PRO_EACH_LAYER  
              (  
                VAR_MON                       IN   VARCHAR2  
              )  
  AS    
                .............  
   
  begin  
  ..........................  
                EXECUTE   IMMEDIATE   'SET   TRANSACTION   USE   ROLLBACK   SEGMENT   RB2';  
   
                OPEN   CUR_LAYER;  
                LOOP  
                          FETCH   CUR_LAYER   INTO   IS_LAYER;  
                          EXIT   WHEN   CUR_LAYER%NOTFOUND;  
   
                          IS_DETAIL   :=   'DETAIL_'||IS_LAYER||'L';  
   
                          ERROR_:='非基板、委外、成型的原物料,制造費用,直接人工計算出錯!';  
   
                          SQLTXT   :=   'UPDATE   CM_EACH_LAYER_DETAIL   A                                                         ';  
                          SQLTXT   :=   SQLTXT||'   SET         A.'||IS_DETAIL||'=   (                                           ';  
                          SQLTXT   :=   SQLTXT||'   SELECT   SUM(B.TOTAL_USE_AMOUNT)                                     ';  
                          SQLTXT   :=   SQLTXT||'   FROM       CM_PART_ST_MATERIAL_COST_SAVED   B                   ';  
                          SQLTXT   :=   SQLTXT||'   WHERE     B.MON_DATE=   '''||VAR_MON||'''                         ';  
                          SQLTXT   :=   SQLTXT||'   AND         B.ST_ID   NOT   IN   (''RT'')                                     ';  
                          SQLTXT   :=   SQLTXT||'   AND         B.COST_CODE   NOT   IN   (''JB00'',''WGCOST'')   ';  
                          SQLTXT1   :=   '   AND         SUBSTR(B.PART_ID,4,1)='''||IS_LAYER||'''                 ';  
                          SQLTXT1   :=   SQLTXT1||'   AND         B.ST_ID=A.ST_ID                                                 ';    
                          SQLTXT1   :=   SQLTXT1||'   AND         B.TYPE=A.COST_TYPE     )                                     ';  
                          SQLTXT1   :=   SQLTXT1||'   WHERE     A.MON_DATE='''||VAR_MON||'''                       ';  
                          SQLTXT1   :=   SQLTXT1||'   AND         A.ST_ID   NOT   IN   (''JB_CT'',''WG_CT'',''RT'')     ';  
                          SQLTXT1   :=   SQLTXT1||'   AND         A.COST_TYPE   IN   (''原物料'',''制造費用'',''直接人工'')   ';  
   
                          EXECUTE   IMMEDIATE   SQLTXT||SQLTXT1;  
   
                          ERROR_:='沖型的原物料,制造費用,直接人工計算出錯!';  
   
                          SQLTXT   :=   'UPDATE   CM_EACH_LAYER_DETAIL   A                                                         ';  
                          SQLTXT   :=   SQLTXT||'   SET         A.'||IS_DETAIL||'=   (                                           ';  
                          SQLTXT   :=   SQLTXT||'   SELECT   SUM(B.TOTAL_USE_AMOUNT)                                     ';  
                          SQLTXT   :=   SQLTXT||'   FROM       CM_PART_ST_MATERIAL_COST_SAVED   B                   ';  
                          SQLTXT   :=   SQLTXT||'   WHERE     B.MON_DATE   =   '''||VAR_MON||'''                       ';  
                          SQLTXT   :=   SQLTXT||'   AND         B.ST_ID   =   ''RT''                                                   ';      
                          SQLTXT   :=   SQLTXT||'   AND         B.COST_DES   LIKE   ''%沖型%''                               ';  
                          SQLTXT1   :=   '   AND         SUBSTR(B.PART_ID,4,1)='''||IS_LAYER||'''                 ';  
                          SQLTXT1   :=   SQLTXT1||'   AND         B.TYPE=A.COST_TYPE     )                                     ';  
                          SQLTXT1   :=   SQLTXT1||'   WHERE     A.MON_DATE='''||VAR_MON||'''                       ';  
                          SQLTXT1   :=   SQLTXT1||'   AND         A.COST_CENTER   =   ''A34''                                 ';  
                          SQLTXT1   :=   SQLTXT1||'   AND         A.COST_TYPE   IN   (''原物料'',''制造費用'',''直接人工'')   ';  
   
                          EXECUTE   IMMEDIATE   SQLTXT||SQLTXT1;  
                          ERROR_:='計算表面處理和成型方式綜合數據出錯';  
   
                          OPEN   CUR_SUR;  
                          LOOP  
                                    FETCH   CUR_SUR   INTO   IS_SUR;  
                                    EXIT   WHEN   CUR_SUR%NOTFOUND;  
   
                                    --求得去處本身所剩下的表面處理站別  
                                    IS_SURFACE   :=   SUBSTR(IS_SUR,1,INSTR(IS_SUR,'+')-1);  
                                    ALL_SURFACE   :=   '''HA'''||','||'''EG'''||','||'''GP'''||','||'''SF'''   ;  
                                    IS_POS   :=   INSTR(ALL_SURFACE,IS_SURFACE);  
                                    IS_LEN   :=   LENGTH(ALL_SURFACE);  
                                    IS_ST   :=     SUBSTR(ALL_SURFACE,1,IS_POS-1)||SUBSTR(ALL_SURFACE,IS_POS+5,IS_LEN);  
                                    IS_ST   :=     SUBSTR(IS_ST,1,IS_LEN-5);  
   
                                    --記錄相反的成型方式  
                                    SELECT   DECODE(SUBSTR(IS_SUR,INSTR(IS_SUR,'+')+1,LENGTH(IS_SUR)),'CUT','成型沖型','成型切型')  
                                    INTO       IS_FLAG   FROM   DUAL   ;  
   
                                    SQLTXT   :=   'UPDATE   CM_EACH_LAYER_DETAIL   A   SET   A.'||IS_DETAIL||'   =   (     ';  
                                    SQLTXT   :=   SQLTXT||'   SELECT   SUM(B.'||IS_DETAIL||')                                       ';  
                                    SQLTXT   :=   SQLTXT||'   FROM       CM_EACH_LAYER_DETAIL   B                                       ';  
                                    SQLTXT   :=   SQLTXT||'   WHERE     B.MON_DATE   =   '''||VAR_MON||'''                       ';  
                                    SQLTXT   :=   SQLTXT||'   AND         B.COST_TYPE   =   ''單位成本''                               ';  
                                    SQLTXT   :=   SQLTXT||'   AND         B.DES   <>   '''||IS_FLAG||'''                               ';  
                                    SQLTXT   :=   SQLTXT||'   AND         INSTR(B.COST_CENTER,''+'')   =   0                       ';  
                                    SQLTXT   :=   SQLTXT||'   AND         B.ST_ID   NOT   IN   ('||IS_ST||')                     )     ';  
                                    SQLTXT   :=   SQLTXT||'   WHERE     A.MON_DATE   =   '''||VAR_MON||'''                       ';  
                                    SQLTXT   :=   SQLTXT||'   AND         A.COST_CENTER   =   '''||IS_SUR||'''                   ';  
   
                                    EXECUTE   IMMEDIATE   SQLTXT;  
   
                          END   LOOP;  
                          CLOSE   CUR_SUR;  
   
                END   LOOP;  
                CLOSE   CUR_LAYER;  
  ..............................................Top

7 楼SZJAVA(chen)回复于 2005-04-19 16:57:53 得分 0

谢了,自己动手做一做吧!谢谢啦!!到时结贴时,不会忘了你!嘿嘿Top

8 楼SZJAVA(chen)回复于 2005-04-20 15:27:40 得分 0

在存储过程中加入临时表,生成动态的SQL语句,把结果插入到临时表里,再用游标取回结果是可以,但复杂一点的SQL组就麻烦了,在SQL里加几个自己写的函数,那就更难处理动态SQL语句了,不知哪一位兄台有更好一点的处理方法?  
  我现在的情况是这样的  
  在一张报表里,按一定的条件查询出结果,我又要在结果里查询,其中的查询条件是这样的  
  被查的字段名下拉框里选,操作符也是从下拉框里选,(>,<,=,<>,like),选定二项后,就在文本框里写结果,如   (日期=2005-01-01),日期和=分别是从二个下拉框里选中的,其中日期是报表的一个项.  
   
  有哪一位兄台有好的方法处理我的第二次查询,申明一点,我第一次查询也是写存储过程的形式实现的,而且存储过程中调用了八个自己写的函数,所以说报表比较复杂!  
  Top

9 楼SZJAVA(chen)回复于 2005-04-20 15:29:54 得分 0

来者帮我顶一下,谢谢各位关注!分值不够可以另开贴!  
  Top

相关问题

  • Oracle存储过程
  • Oracle存储过程(急)
  • oracle的存储过程
  • Oracle存储过程两问
  • oracle 存储过程 急问!!!!!!!
  • oracle存储过程问题
  • Oracle的存储过程与MS SQL Server的存储过程
  • 在Oracle的存储过程中动态调用存储过程
  • Oracle的存储过程如何转成SQL Server存储过程
  • 求教,SQL存储过程移植到——oracle存储过程。

关键词

  • 存储过程
  • 查询
  • 报表
  • sqltxt
  • strareaname
  • strareacode
  • zdname
  • 游标
  • 谢谢
  • qing

得分解答快速导航

  • 帖主:SZJAVA
  • baojianjun

相关链接

  • Oracle类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo