CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
英特尔®游戏设计大赛100美元现金周周送 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  PowerBuilder >  DataWindow

用存储过程构造数据窗口时出错

楼主bbybrandy(观云)2003-09-01 10:51:08 在 PowerBuilder / DataWindow 提问

CREATE   OR   REPLACE   PROCEDURE   "P_SB_GOOD_RATE"         (  
  start_month   IN   CHAR     DEFAULT   NULL,  
  end_month   IN   CHAR     DEFAULT   NULL,  
  RC1       OUT   ty_tbc_globalpkg.globalPkg.RCT1)  
  AS  
  start_month_   CHAR(6)   :=   start_month;  
  end_month_   CHAR(6)   :=   end_month;  
  StoO_selcnt INTEGER;  
  StoO_error   INTEGER;  
  StoO_rowcnt INTEGER;  
  StoO_crowcnt INTEGER   :=   0;  
  StoO_fetchstatus INTEGER   :=   0;  
  StoO_errmsg VARCHAR2(255);  
  StoO_sqlstatus INTEGER;  
  year_end   NUMBER(10,0);  
  month_end   NUMBER(10,0);  
  month_start   NUMBER(10,0);  
  month   VARCHAR2(20);  
  dept_nm   VARCHAR2(50);  
  dept_nm1   VARCHAR2(50);  
  li_cnt_good   NUMBER(10,0);  
  li_cnt_good1   NUMBER(10,0);  
  li_cnt_total   NUMBER(10,0);  
  li_cnt_bad   NUMBER(10,0);  
  ld_dept_id   NUMBER(18,0);  
  ld_rate   NUMBER(12,4);  
  ld_rate_chk   NUMBER(12,4);  
  i   NUMBER(10,0);  
  CURSOR   c1   IS    
  SELECT   DISTINCT     sb_good_cond_rec_s.mon,   sb_equi_acc.act_dept_id,    
  rl_dept_cd.sys_cd_nm    
    FROM   rl_dept_cd,   sb_equi_acc,   sb_good_cond_rec_s      
  WHERE      
  (sb_equi_acc.id_key   =   sb_good_cond_rec_s.equi_id)      
    and      
  (rl_dept_cd.sys_id_key   =   sb_equi_acc.act_dept_id)      
    and   ROUND(   TO_NUMBER(SUBSTR(sb_good_cond_rec_s.mon,   1,   4)),0)    
  =   year_end      
  ORDER   BY   rl_dept_cd.sys_ord_cd   ;  
   
   
   
  BEGIN  
  BEGIN  
   
  year_end   :=     ROUND(   TO_NUMBER(SUBSTR(end_month_,1,   4)),0);  
   
  month_end   :=     ROUND(   TO_NUMBER(SUBSTR(end_month_,LENGTH(end_month_)   -   1,2)),0);  
   
  month_start   :=     ROUND(   TO_NUMBER(SUBSTR(start_month_,LENGTH(start_month_)   -     1,     2)),0);  
   
  i   :=     0;  
  DELETE   FROM   TT_TEMP_GEN_1;  
  NULL;/*DECLARE   CURSOR   c1   */  
  BEGIN  
  StoO_error       :=   0;  
  StoO_rowcnt     :=   0;  
  StoO_crowcnt     :=   0;  
  open   c1;  
  END;  
  BEGIN  
  StoO_error       :=   0;  
  StoO_rowcnt     :=   0;  
  StoO_crowcnt     :=   0;  
  fetch   c1   into    
  month,   ld_dept_id,   dept_nm;  
  EXCEPTION  
  WHEN   OTHERS   THEN  
  StoO_rowcnt   :=   0;  
  StoO_selcnt   :=   0;  
  StoO_error   :=   SQLCODE;  
  StoO_errmsg   :=   SQLERRM;  
  --raise_application_error(SQLCODE,   SQLERRM,true);    
  END;  
  --IF   c1%NOTFOUND   THEN  
  -- StoO_sqlstatus   :=   2;  
  -- StoO_fetchstatus   :=   -1;  
  --ELSE  
  -- StoO_sqlstatus   :=   0;  
  -- StoO_fetchstatus   :=   0;  
  --END   IF;  
   
  dept_nm1   :=     dept_nm;  
   
  i   :=     i   +   1;  
   
  dept_nm   :=     RPAD(i,   2,   '   ')||'     '   ||   dept_nm;  
  IF     (   SQL%NOTFOUND)   THEN  
  BEGIN  
  BEGIN  
  StoO_error       :=   0;  
  StoO_rowcnt     :=   0;  
  close   c1;  
  EXCEPTION  
  WHEN   NO_DATA_FOUND   THEN  
  NULL;  
  WHEN   OTHERS   THEN  
  StoO_error   :=   SQLCODE;  
  StoO_errmsg   :=   SQLERRM;  
  --raise_application_error(SQLCODE,   SQLERRM,true);    
  END;  
  OPEN   RC1   FOR  
   
  SELECT   TT_TEMP_GEN_1.chk_month  
  ,     TT_TEMP_GEN_1.dept_id  
  ,     TT_TEMP_GEN_1.dept_nm  
  ,     TT_TEMP_GEN_1.good_rate  
    FROM   TT_TEMP_GEN_1;  
  RETURN   ;  
  END;  
  END   IF;  
  <<i_loop1>>  
  WHILE     (   SQL%FOUND)   LOOP  
  BEGIN  
  BEGIN  
  StoO_rowcnt   :=   0;  
  StoO_selcnt   :=   0;  
  StoO_error     :=   0;  
   
   
  SELECT       count(*)  
  INTO   li_cnt_total  
    FROM   sb_equi_acc      
  WHERE   sb_equi_acc.abc_tp     IN   ('A',   'B')      
    AND   sb_equi_acc.act_dept_id   =   ld_dept_id;  
  StoO_rowcnt   :=   SQL%ROWCOUNT;  
   
  EXCEPTION  
  WHEN   TOO_MANY_ROWS   THEN  
  StoO_rowcnt   :=   2;  
  WHEN   NO_DATA_FOUND   THEN  
  StoO_rowcnt   :=   0;  
  StoO_selcnt   :=   0;  
  WHEN   OTHERS   THEN  
  StoO_rowcnt   :=   0;  
  StoO_selcnt   :=   0;  
  StoO_error   :=   SQLCODE;  
  StoO_errmsg   :=   SQLERRM;  
  raise_application_error(SQLCODE,   SQLERRM,true);    
  END;  
  BEGIN  
  StoO_rowcnt   :=   0;  
  StoO_selcnt   :=   0;  
  StoO_error     :=   0;  
   
   
  SELECT       count(*)  
  INTO   li_cnt_bad  
    FROM   sb_good_cond_rec_s,   sb_equi_acc      
  WHERE      
  (sb_equi_acc.id_key   =   sb_good_cond_rec_s.equi_id)      
    AND   sb_good_cond_rec_s.mark   <   85      
    AND   sb_good_cond_rec_s.chk_tp   =   '1'      
    AND   sb_good_cond_rec_s.mon   =   month      
    AND   sb_equi_acc.act_dept_id   =   ld_dept_id;  
  StoO_rowcnt   :=   SQL%ROWCOUNT;  
   
  EXCEPTION  
  WHEN   TOO_MANY_ROWS   THEN  
  StoO_rowcnt   :=   2;  
  WHEN   NO_DATA_FOUND   THEN  
  StoO_rowcnt   :=   0;  
  StoO_selcnt   :=   0;  
  WHEN   OTHERS   THEN  
  StoO_rowcnt   :=   0;  
  StoO_selcnt   :=   0;  
  StoO_error   :=   SQLCODE;  
  StoO_errmsg   :=   SQLERRM;  
  raise_application_error(SQLCODE,   SQLERRM,true);    
  END;  
      li_cnt_good   :=     li_cnt_total    
  -   li_cnt_bad;  
  ld_rate   :=     ROUND(   TO_NUMBER((   ROUND(   TO_NUMBER(li_cnt_good),4)    
  /   ROUND(   TO_NUMBER(li_cnt_total),4)   )),4);  
  BEGIN  
  StoO_rowcnt   :=   0;  
  StoO_selcnt   :=   0;  
  StoO_error     :=   0;  
  SELECT       count(*)  
  INTO   li_cnt_bad  
    FROM   sb_good_cond_rec_s,   sb_equi_acc      
  WHERE      
  (sb_equi_acc.id_key   =   sb_good_cond_rec_s.equi_id)      
    AND   sb_good_cond_rec_s.mark   <   85      
    AND   sb_good_cond_rec_s.chk_tp   =   '2'      
    AND   sb_good_cond_rec_s.mon   =   month      
    AND   sb_equi_acc.act_dept_id   =   ld_dept_id;  
  StoO_rowcnt   :=   SQL%ROWCOUNT;  
   
  EXCEPTION  
  WHEN   TOO_MANY_ROWS   THEN  
  StoO_rowcnt   :=   2;  
  WHEN   NO_DATA_FOUND   THEN  
  StoO_rowcnt   :=   0;  
  StoO_selcnt   :=   0;  
  WHEN   OTHERS   THEN  
  StoO_rowcnt   :=   0;  
  StoO_selcnt   :=   0;  
  StoO_error   :=   SQLCODE;  
  StoO_errmsg   :=   SQLERRM;  
  raise_application_error(SQLCODE,   SQLERRM,true);    
  END;  
  li_cnt_good1   :=     li_cnt_good    
  -   li_cnt_bad;  
  ld_rate_chk   :=     ROUND(   TO_NUMBER((   ROUND(   TO_NUMBER(li_cnt_good1),4)    
  /   ROUND(   TO_NUMBER(li_cnt_good),4)   )),4);  
   
  ld_rate   :=     ld_rate   *   ld_rate_chk    
  *   100;  
   
  month_start   :=     ROUND(   TO_NUMBER(SUBSTR(month,    
  LENGTH(month)   -     2   +   1,     2)),0);  
  BEGIN  
  StoO_error       :=   0;  
  StoO_rowcnt     :=   0;  
  INSERT   INTO   TT_TEMP_GEN_1    
  VALUES   (month_start,   ld_dept_id,    
  dept_nm,   ld_rate);  
  StoO_rowcnt   :=   SQL%ROWCOUNT;  
  EXCEPTION  
  WHEN   NO_DATA_FOUND   THEN  
  NULL;  
  WHEN   OTHERS   THEN  
  StoO_error   :=   SQLCODE;  
  StoO_errmsg   :=   SQLERRM;  
  raise_application_error(SQLCODE,   SQLERRM,true);    
  END;  
  BEGIN  
  StoO_error       :=   0;  
  StoO_rowcnt     :=   0;  
  StoO_crowcnt     :=   0;  
  fetch   c1   into    
  month,   ld_dept_id,   dept_nm;  
  EXCEPTION  
  WHEN   OTHERS   THEN  
  StoO_rowcnt   :=   0;  
  StoO_selcnt   :=   0;  
  StoO_error   :=   SQLCODE;  
  StoO_errmsg   :=   SQLERRM;  
  raise_application_error(SQLCODE,   SQLERRM,true);    
  END;  
  IF   c1%NOTFOUND   THEN  
  StoO_sqlstatus   :=   2;  
  StoO_fetchstatus   :=   -1;  
  ELSE  
  StoO_sqlstatus   :=   0;  
  StoO_fetchstatus   :=   0;  
  END   IF;  
  IF     dept_nm   =   dept_nm1   THEN  
   
  dept_nm   :=     RPAD(i,   2,   '   ')    
  +   '     '   ||   dept_nm;  
  ELSE  
  BEGIN  
   
  i   :=     i   +   1;  
   
  dept_nm1   :=     dept_nm;  
   
  dept_nm   :=     RPAD(i,   2,   '   ')    
  +   '     '   ||   dept_nm;  
  END;  
  END   IF;  
  END;  
  END   LOOP;  
  BEGIN  
  StoO_error       :=   0;  
  StoO_rowcnt     :=   0;  
  close   c1;  
  EXCEPTION  
  WHEN   NO_DATA_FOUND   THEN  
  NULL;  
  WHEN   OTHERS   THEN  
  StoO_error   :=   SQLCODE;  
  StoO_errmsg   :=   SQLERRM;  
  raise_application_error(SQLCODE,   SQLERRM,true);    
  END;  
  OPEN   RC1   FOR  
   
  SELECT   TT_TEMP_GEN_1.chk_month  
  ,     TT_TEMP_GEN_1.dept_id  
  ,     TT_TEMP_GEN_1.dept_nm  
  ,     TT_TEMP_GEN_1.good_rate  
    FROM   TT_TEMP_GEN_1;  
  END;  
  END   P_SB_GOOD_RATE;  
   
  我用的是oracle数据库,用上面这个存储过程构造数据窗口时出错,请各位指导一下,谢谢 问题点数:0、回复次数:10Top

1 楼aty283(白冰)回复于 2003-09-01 12:26:28 得分 0

upTop

2 楼jerrymao(加菲猫--抵制倭寇和高丽棒子)回复于 2003-09-01 12:42:45 得分 0

看都看累了,你就不能用一个视图啊,或者用这个过程创建一个表。Top

3 楼bbybrandy(观云)回复于 2003-09-01 12:58:45 得分 0

用   pl/sql   developer   打开,就一目了然了,本身没什么错误  
  就是用它来构建数据窗口的时候出错  
  谢谢upTop

4 楼bbybrandy(观云)回复于 2003-09-01 15:51:06 得分 0

up有分  
  Top

5 楼jerrymao(加菲猫--抵制倭寇和高丽棒子)回复于 2003-09-01 15:58:49 得分 0

你的最后一句话,OPEN   RC1   FOR  
   
  SELECT   TT_TEMP_GEN_1.chk_month  
  ,     TT_TEMP_GEN_1.dept_id  
  ,     TT_TEMP_GEN_1.dept_nm  
  ,     TT_TEMP_GEN_1.good_rate  
    FROM   TT_TEMP_GEN_1;  
   
  我怀疑有问题,你唯一调用TT_TEMP_GEN_1就是在两个end的时候Top

6 楼bbybrandy(观云)回复于 2003-09-01 16:10:11 得分 0

这有个很简单的存储过程,用它来做数据源也不行:  
  CREATE   OR   REPLACE   PROCEDURE   p_equ_workrate   (  
  start_dt   in   date   DEFAULT   NULL,  
  end_dt   in   date   DEFAULT   NULL,  
  dept_id   in   number   DEFAULT   NULL,  
  days   in   number   DEFAULT   NULL,  
  hours   in   number   DEFAULT   NULL,  
  RC1     OUT   ty_tbc_globalpkg.globalPkg.RCT1)                      
  as        
  BEGIN  
  DELETE   TT_TEMP_EQU_WORKRATE;  
  insert   INTO   tt_temp_equ_workrate(dept_id,dept_nm   ,equi_id,pos,output,jldw_id,work_time)    
  select       DISTINCT   a.dept_id,    
                  c.sys_cd_nm,    
                  a.equi_id,    
                  b.equi_pos_no,    
                  sum(a.output),    
                  max(a.jldw_id),    
                  sum(a.run_tm1   +   a.stop_tm   +   a.adju_tm   -   a.eff_rate_tm)    
  from         sb_run_rec_s   a   ,sb_equi_acc   b   ,sha.rl_dept_cd   c      
  where       a.dept_id   =   c.sys_id_key   and    
                  a.equi_id   =   b.id_key   and      
                  start_dt<=a.dt   and    
                  end_dt>=a.dt   and    
                  a.dept_id   =   dept_id    
  group   by   a.dept_id,a.equi_id,c.sys_cd_nm,b.equi_pos_no   ;  
  DELETE   FROM   TT_TEMP_EQU_11;  
  INSERT   INTO   TT_TEMP_EQU_11  
  select   a.equi_id,a.team_id    
  from   sb_run_rec_s   a    
  where       start_dt<=a.dt   and    
                  end_dt>=a.dt   and    
                  a.dept_id   =   dept_id    
  group   by   a.equi_id,a.team_id    
  having   count(a.team_id)   >=   days   and   sum(a.run_tm1   +   a.adju_tm   )   >=   hours   ;    
     
  /*??temp1???,??temp2??????????temp1???*/    
  delete   from   tt_temp_equ_workrate   a    
  where   a.equi_id   not   in   (select   distinct   equi_id   from   TT_TEMP_EQU_11)   ;  
   
  update   tt_temp_equ_workrate   b  
  set   b.jldw_nm   =   (select   a.sys_cd_nm    
  from   sha.sb_jldw_cd   a,tt_temp_equ_workrate    
  where   a.sys_id_key   =   tt_temp_equ_workrate.jldw_id   );  
     
  update   tt_temp_equ_workrate   b  
  set   b.output_xs   =   (select   NVL(a.coeff,0)    
  from   sha.sb_jldw_cd   a   ,   tt_temp_equ_workrate   b  
  where   a.sys_id_key   =   b.jldw_id)   ;  
   
  update   tt_temp_equ_workrate   d  
  set   (d.design_capa,d.capa_xs)   =   (select   nvl(b.desi_prod_capa,0),  
    nvl(c.coeff,0)    
  from   sb_equi_acc   a,sha.sb_model_cd   b,sha.sb_jldw_cd   c,tt_temp_equ_workrate   d    
  where   a.mdl_id   =   b.sys_id_key   and        
              b.capa_unit_id   =   c.sys_id_key   and    
              a.id_key   =   d.equi_id   );  
               
  update   tt_temp_equ_workrate    
  set   workrate   =   to_number((output*output_xs)/(work_time*design_capa*capa_xs),'9,9999')    
  where   work_time<>0   and   design_capa<>0   and   capa_xs<>0   ;  
   
  OPEN   RC1   FOR  
  select   dept_nm   ,  
                pos   ,  
                workrate,  
                output,  
                jldw_nm,  
                work_time    
                from   tt_temp_equ_workrate;  
  END   P_EQU_WORKRATE;  
  Top

7 楼jerrymao(加菲猫--抵制倭寇和高丽棒子)回复于 2003-09-01 16:17:18 得分 0

SQL语句怎么看都没有问题啊,是不是你调用的包有点问题?Top

8 楼bbybrandy(观云)回复于 2003-09-01 17:19:26 得分 0

错误是:sqlstate=37000  
                [oracle][odbc]syntax   error   or   access   violationTop

9 楼jerrymao(加菲猫--抵制倭寇和高丽棒子)回复于 2003-09-01 17:41:34 得分 0

sqlstate=37000的错误代码表示:sql语句中间语法错误,而且以操作符丢失为主。可是我还是找不出来那有操作性的错误Top

10 楼bbybrandy(观云)回复于 2003-09-02 09:55:01 得分 0

我把我调用的包都检查了一遍,都没什么问题,55555555555  
  难道我没救了????????Top

相关问题

  • 存储过程出错?
  • 存储过程出错
  • 存储过程出错!
  • 存储过程出错!!急!
  • 存储过程出错!
  • 执行存储过程,数据类型 numeric 转换为 decimal 时出错
  • 运行存储过程时 将数据类型 varchar 转换为 float 时出错
  • 数据库存储过程!?
  • 调用存储过程出错 将数据类型 nvarchar 转换为 int 时出错。 100分!!!!!
  • 存储过程的问题:附出错的存储过程

关键词

  • stoo
  • equi
  • workrate
  • dept
  • capa
  • rowcnt
  • jldw
  • equ
  • sb
  • tt

得分解答快速导航

  • 帖主:bbybrandy

相关链接

  • PowerBuilder类图书
  • PowerBuilder类源码下载

广告也精彩

反馈

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