-oracle数据库恢复-Raid5数据恢复-RAID0数据恢复oracle 开发区 → 触发器中ora-06502错误


  共有3106人关注过本帖树形打印

主题:触发器中ora-06502错误

oracle数据恢复-RAID5数据恢复-raid数据恢复
gateci
  1楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


数据恢复 恢复数据
等级:新手上路 帖子:1 积分:76 威望:0 精华:0 注册:2007-7-29 10:06:20
触发器中ora-06502错误  发帖心情 Post By:2007-7-31 9:54:11

这是我的触发器代码

CREATE OR REPLACE TRIGGER t_lis
AFTER UPDATE
OF CHARGE_FLAG
ON LAB.LAB_TEST_ITEMS
REFERENCING NEW AS New OLD AS Old
FOR EACH ROW
when (new.charge_flag = 0)
DECLARE
  ls_test_no       VARCHAR2(10);--????
 ls_item_code     VARCHAR2(10);--????
  ls_performed_by  VARCHAR2(8);--????
 ls_ordered_by    VARCHAR2(8);--????
  ls_test_by       VARCHAR2(8);--???
  ls_patientid     VARCHAR2(10);
  is_charge_type   VARCHAR2(8);
  is_item_spec   VARCHAR2(40);--??
  is_item_class    VARCHAR2(1);
  is_charge_item_code   VARCHAR2(10);--????
  is_item_units    VARCHAR2(8);-- ??
  ls_order_doctor_code  VARCHAR2(16);-- ??
  ls_performed_name  VARCHAR2(20);-- ???????
  ls_order_name    VARCHAR2(20);-- ???????
  li_visitid       INTEGER;
  li_discharge_taking integer; --????
  ll_item_no       number(6);
  ldc_amount       number(4);
  ldc_cost         number(8,2);-- ????
  ld_charge        number(8,2);
  ls_order_group     VARCHAR2(8);
  ls_rcpt_no       VARCHAR2(8);
  ldt_bill_datetime    DATE;
  as_derate        VARCHAR2(1);
 
  CURSOR get_charge_item_cursor(item_code in VARCHAR2) IS
  SELECT CURRENT_PRICE_LIST.ITEM_SPEC,  
         CURRENT_PRICE_LIST.UNITS,  
         CURRENT_PRICE_LIST.ITEM_CLASS,  
         CLINIC_VS_CHARGE.CHARGE_ITEM_CODE,  
         CLINIC_VS_CHARGE.AMOUNT 
    FROM CLINIC_VS_CHARGE,  
         CURRENT_PRICE_LIST 
   WHERE ( CLINIC_VS_CHARGE.CHARGE_ITEM_CODE = CURRENT_PRICE_LIST.ITEM_CODE ) and 
         ((CLINIC_VS_CHARGE.CLINIC_ITEM_CODE = item_code ) AND 
         ( CLINIC_VS_CHARGE.CLINIC_ITEM_CLASS = 'C' ) ) ;
BEGIN

  select :new.TEST_NO,
         :new.ITEM_CODE,
         :new.TEST_BY
  into   ls_test_no,
         ls_item_code,
         ls_test_by
  from dual;
  --if :new.TEST_NO is null then
     --dbms_output.put_line('error');
  --end if;
 
  select LAB_TEST_MASTER.PERFORMED_BY,
         LAB_TEST_MASTER.ORDERING_DEPT ,
         LAB_TEST_MASTER.patient_id ,
         LAB_TEST_MASTER.visit_id
  into ls_performed_by,
       ls_ordered_by,
       ls_patientid,
       li_visitid
  from LAB_TEST_MASTER
  where LAB_TEST_MASTER.TEST_NO =ls_test_no ;
  --and   LAB_TEST_MASTER.VISIT_ID > '0';
       
  if ls_test_by is null  then
     ls_test_by := '3303';
  end if;
              
  SELECT  
         PAT_MASTER_INDEX.CHARGE_TYPE
  into 
         is_charge_type
  FROM   CHARGE_TYPE_DICT,  
         PAT_MASTER_INDEX,
         CHARGE_PRICE_SCHEDULE 
  WHERE  (pat_master_index.charge_type = charge_price_schedule.charge_type (+)) and 
         ( PAT_MASTER_INDEX.CHARGE_TYPE = CHARGE_TYPE_DICT.CHARGE_TYPE_NAME ) and 
         ( ( PAT_MASTER_INDEX.PATIENT_ID = ls_patientid ) ) ;   
 
  ld_charge := 0;    
 
  FOR get_charge_item_cursor_rec IN get_charge_item_cursor(ls_item_code) LOOP                                       
     BEGIN
        is_item_spec := get_charge_item_cursor_rec.ITEM_SPEC;
        is_item_units := get_charge_item_cursor_rec.UNITS;
        is_item_class := get_charge_item_cursor_rec.ITEM_CLASS;
      
       ll_item_no := 0;
        li_discharge_taking :=0;--?????
       
        select ordering_provider into ls_order_name from lab_test_master where test_no = ls_test_no;
        select db_user into ls_order_doctor_code from users where user_name=ls_order_name and rownum=1;
        ld_charge:=ld_charge + f_save_inbill_detail(ls_patientid,li_visitid,is_charge_type,is_item_class,is_charge_item_code,-
                    is_item_spec,is_item_units,ldc_amount,ls_ordered_by,ls_performed_by,ls_performed_name,ls_order_doctor_code,-
                    ls_test_by,li_discharge_taking,ls_order_group,ls_order_name,ls_rcpt_no,ldt_bill_datetime,as_derate);
        if ld_charge > 0 then
        update lab_test_items set charge_flag = 1 where test_no = ls_test_no and item_code = ls_item_code;
      end if;
       
      end;
  end loop;
  -- add
  if ld_charge > 0 then
     update lab_test_master set BILLING_INDICATOR = 1 where TEST_NO = ls_test_no ;
     update lab_test_master set  RESULT_STATUS = '2' where TEST_NO = ls_test_no and RESULT_STATUS<2;
  end if;
 
END;
--t_list;

错误在

FOR get_charge_item_cursor_rec IN get_charge_item_cursor(ls_item_code) LOOP                                       
     BEGIN
        is_item_spec := get_charge_item_cursor_rec.ITEM_SPEC;
        is_item_units := get_charge_item_cursor_rec.UNITS;
        is_item_class := get_charge_item_cursor_rec.ITEM_CLASS;
此处老是提示

ora -06502:numeric or value error:character to number conversion error

我看了,我的is_item_class变量和表CLINIC_VS_CHARGE的数据类型都是varchar2(1),实在不知道怎样在数据类型转换处出错了

我的CLINIC_VS_CHARGE表脚本是

CREATE TABLE LAB_TEST_ITEMS
(
  TEST_NO       VARCHAR2(10),
  ITEM_NO       NUMBER(2),
  ITEM_NAME     VARCHAR2(80),
  ITEM_CODE     VARCHAR2(10),
  CHARGE_STATE  VARCHAR2(1)                     DEF***T 0,
  DONE_STATE    VARCHAR2(1)                     DEF***T 0,
  CHARGE_FLAG   VARCHAR2(1),
  TEST_BY       VARCHAR2(8)
)


支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
oracle数据恢复-RAID5数据恢复-raid数据恢复
sosdb
  2楼 个性首页 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


数据恢复 恢复数据
等级:超级版主 帖子:809 积分:10386 威望:0 精华:1 注册:2007-1-28 11:50:49
  发帖心情 Post By:2007-7-31 10:30:36

查看调用 li_visitid       INTEGER;
  li_discharge_taking integer; --????
  ll_item_no       number(6);
  ldc_amount       number(4);
  ldc_cost         number(8,2);-- ????
  ld_charge        number(8,2);
变量的地方吧


www.sosdb.com 专业数据库恢复

oracle数据恢复raid数据恢复

qq:9417901

msn:glkgdj@hotmail.com

支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部

返回版面帖子列表

触发器中ora-06502错误








签名