2015-09-15 3 views
-2

Мне очень жаль. Я новый оракул, и я создал следующий блок, который является результатом вывода, а затем ошибкой. Первый курсор генерирует вывод, а затем ошибку, и поэтому второй курсор не генерирует вывод.ORA-06502: PL/SQL: числовое значение или значение

Пожалуйста, помогите без ошибок.

спасибо и привет

Ошибка:

END; 
Error report: 
ORA-06502: PL/SQL: numeric or value error 
ORA-06512: at line 36 
06502. 00000 - "PL/SQL: numeric or value error%s" 
*Cause:  
*Action: 

Блок:

DECLARE 
     c_dbuser SYS_REFCURSOR; 
     c_dbuser1 SYS_REFCURSOR; 
     temp_dbuser FIT_SCHEMA.fxf_inspt_insp_main%ROWTYPE; 

     year_date varchar2(20):='2014'; 
     typeOfGraph varchar2(50):='InspectionByInspection'; 
     division varchar2(20):='Division'; 
     subDiv varchar2(20):='ALL'; 
     emp varchar2(20):=''; 


     TYPE t_name IS RECORD(   --Error is at this line :( 
     inspectiondate varchar2(20), 
     totalcount number(38), 
     inspectionDesc varchar2(20) 

    ); 
     r_name t_name; -- name record 

    TYPE t_monthwise is record (
     month_number varchar2(20), 
     inspcount number(38), 
     inspectionDesc varchar2(20) 


    ); 

    t_month t_monthwise; 
    BEGIN 

    fit_schema.My_manager(typeOfGraph,year_date,division,subDiv,emp,c_dbuser,c_dbuser1); 

     LOOP 

     FETCH c_dbuser INTO r_name ; 

     EXIT WHEN c_dbuser%NOTFOUND; 
     dbms_output.put_line(r_name.inspectiondate ||' '||r_name.totalcount||' '||r_name.inspectionDesc); 

    END LOOP; 
     LOOP 
     FETCH c_dbuser1 INTO t_month ; 


      EXIT WHEN c_dbuser1%NOTFOUND; 
     dbms_output.put_line(t_month.month_number ||' '||t_month.inspcount||' '||t_month.inspectionDesc); 

    END LOOP; 
     CLOSE c_dbuser; 
     CLOSE c_dbuser1; 


END; 

Выходные:

13-DEC-2014 1 3#CPLD Only 
13-DEC-2014 4 0#Class Only 
14-DEC-2014 1 0#Class Only 
15-DEC-2014 2 0#Class Only 
16-DEC-2014 1 0#Class Only 
17-DEC-2014 1 7#Negative Class 
17-DEC-2014 9 0#Class Only 
19-DEC-2014 15 0#Class Only 
22-DEC-2014 1 11#65% Rule 
23-DEC-2014 1 8#XLGH & Class 
30-DEC-2014 1 0#Class Only 
31-DEC-2014 1 10#Mixed Articles 
31-DEC-2014 3 0#Class Only 
02-JAN-2015 2 0#Class Only 
05-JAN-2015 2 0#Class Only 
07-JAN-2015 2 9#XLGH Only 
07-JAN-2015 3 1#Class & Reweigh 
07-JAN-2015 1 10#Mixed Articles 
07-JAN-2015 4 0#Class Only 
07-JAN-2015 2 11#65% Rule 
08-JAN-2015 5 0#Class Only 
08-JAN-2015 1 9#XLGH Only 
09-JAN-2015 1 3#CPLD Only 
09-JAN-2015 1 11#65% Rule 
09-JAN-2015 4 0#Class Only 
09-JAN-2015 1 1#Class & Reweigh 
12-JAN-2015 1 5#CCD Only 
12-JAN-2015 1 3#CPLD Only 
19-JAN-2015 1 11#65% Rule 
20-JAN-2015 1 0#Class Only 
21-JAN-2015 4 0#Class Only 
23-JAN-2015 1 10#Mixed Articles 
26-JAN-2015 1 7#Negative Class 
26-JAN-2015 2 0#Class Only 
27-JAN-2015 1 3#CPLD Only 
27-JAN-2015 3 0#Class Only 
27-JAN-2015 1 6#CCD & Class 
28-JAN-2015 6 0#Class Only 
29-JAN-2015 3 0#Class Only 
29-JAN-2015 1 5#CCD Only 
30-JAN-2015 1 3#CPLD Only 
30-JAN-2015 1 1#Class & Reweigh 
01-FEB-2015 3 0#Class Only 
02-FEB-2015 1 4#CPLD & Class 
02-FEB-2015 1 8#XLGH & Class 
04-FEB-2015 1 0#Class Only 

Запросы от процедуры: -

SELECT TO_CHAR(MAINTABLE.INSP_CREATED_TMSTP,'dd-MON-yyyy') inspectiondate, --varchar2 
    COUNT(MAINTABLE.insp_id) AS totalinspection, --count is number 
    MAINTABLE.insp_type_id ||'#'||ISNPTYPETABLE.INSP_TYPE_DESC AS INSPECTIONDESCRIPTION-- varchar2 
    FROM FIT_SCHEMA.fxf_inspt_insp_main MAINTABLE 
    JOIN FIT_SCHEMA.fxf_inspt_emp_detail EMPTABLE 
    ON(MAINTABLE.inspector_emp_nbr=EMPTABLE.inspector_emp_nbr) 
    JOIN FIT_SCHEMA.fxf_inspt_drop_down DROPDOWNTABLE 
    ON (emptable.division_id = DROPDOWNTABLE.drop_down_id) 
    JOIN FIT_SCHEMA.fxf_inspt_insp_type ISNPTYPETABLE 
    ON(MAINTABLE.insp_type_id    =isnptypetable.insp_type_id) 
    WHERE dropdowntable.is_active_flg   = 1 
    AND MAINTABLE.STATUS_ID     = 8 
    AND MAINTABLE.insp_type_id    IN (0,1,3,4,5,6,7,8,9,10,11,12) 
    AND TRUNC(MAINTABLE.insp_created_tmstp) between TRUNC(EMPTABLE.EFFECTIVE_FROM_TMSTP) 
    And Nvl(Trunc(Emptable.Effective_To_Tmstp),Sysdate) AND UPPER(dropdowntable.drop_down_grp) =UPPER('division') AND TRUNC(MAINTABLE.insp_created_tmstp) between '01-JUN-14' AND '31-MAY-15' GROUP BY TO_CHAR(MAINTABLE.INSP_CREATED_TMSTP,'dd-MON-yyyy') 
     , TRUNC(MAINTABLE.INSP_CREATED_TMSTP), MAINTABLE.insp_type_id ||'#'|| ISNPTYPETABLE.INSP_TYPE_DESC ORDER BY TRUNC(MAINTABLE.INSP_CREATED_TMSTP) 


SELECT TO_CHAR(MAINTABLE.insp_created_tmstp,'MM') AS MONTHNUMBER, 
    COUNT(MAINTABLE.INSP_ID)       AS INSPCOUNT , 
    MAINTABLE.insp_type_id ||'#' 
    ||ISNPTYPETABLE.INSP_TYPE_DESC AS INSPECTIONDESCRIPTION 
    FROM FIT_SCHEMA.fxf_inspt_insp_main MAINTABLE 
    JOIN FIT_SCHEMA.fxf_inspt_emp_detail EMPTABLE 
    ON(MAINTABLE.inspector_emp_nbr=EMPTABLE.inspector_emp_nbr) 
    JOIN FIT_SCHEMA.fxf_inspt_drop_down DROPDOWNTABLE 
    ON (emptable.division_id = DROPDOWNTABLE.drop_down_id) 
    JOIN FIT_SCHEMA.fxf_inspt_insp_type ISNPTYPETABLE 
    ON(MAINTABLE.insp_type_id      =isnptypetable.insp_type_id) 
    WHERE dropdowntable.is_active_flg   = 1 
    AND MAINTABLE.insp_type_id  IN (0,1,3,4,5,6,7,8,9,10,11,12) 
    AND dropdowntable.is_active_flg = 1 
    AND MAINTABLE.STATUS_ID   = 8 
    AND TRUNC(MAINTABLE.insp_created_tmstp) between TRUNC(EMPTABLE.EFFECTIVE_FROM_TMSTP) 
    And Nvl(Trunc(Emptable.Effective_To_Tmstp),Sysdate) AND UPPER(dropdowntable.drop_down_grp) =UPPER('division') 
    AND TRUNC(MAINTABLE.insp_created_tmstp) between '01-JUN-14' 
    AND '31-MAY-15' GROUP BY TO_CHAR(MAINTABLE.insp_created_tmstp,'MM'), MAINTABLE.insp_type_id ||'#'||ISNPTYPETABLE.INSP_TYPE_DESC ORDER BY TO_CHAR(MAINTABLE.insp_created_tmstp,'MM') 
+0

Что такое тип данных 'ISNPTYPETABLE.INSP_TYPE_DESC', и каково максимальное значение' MAINTABLE.insp_type_id'? –

ответ

1

Линия 36:

FETCH c_dbuser INTO r_name ; 

Так один из значений, возвращаемых в вашем c_dbuser реф курсор слишком велик. Маска формата даты будет генерировать только длину строки длиной 11 символов, поэтому inspectiondate будет (более) адекватным, и количество кажется маловероятным, чтобы превысить number(38), так что totalcount также кажется штрафом. Это говорит о том, что inspectionDesc слишком мал для некоторых значений в данных.

Вы генерируя, что из:

MAINTABLE.insp_type_id ||'#'||ISNPTYPETABLE.INSP_TYPE_DESC 

Если общей длины этого каскадной строки превышает 20 символов, то вы получите ошибку на выборку.

Если INSP_TYPE_DESC определено как varchar2(20), то вы не позволяете себе место для отдыха; вам нужен один дополнительный символ для фиксированного # и не менее двух для insp_type_id - больше, если самый высокий идентификатор может быть трехзначным или более. Если это не ограничено, вам нужно будет решить, какое наибольшее число вы ожидаете увидеть, и разрешите это. Итак, если вы ожидаете до трех цифр для идентификатора, определите inspectionDesc как varchar2(24) и т. Д.

+0

спасибо за такое хорошее объяснение :) – sunil