这是我的触发器代码
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)
)