I've changed the function in the following way

CREATE FUNCTION ISEMPINUNITDIVISION (
    UNITDIVISIONID FIXED(9,0),
    ROLETYPEID FIXED(9,0),
    EMPCOMPANYID FIXED(9,0),
    EMPHUMANRESOURCEID FIXED(9,0),
    EMPDSTARTCHR TIMESTAMP,
    F_UD_LTD CHAR(1))
RETURNS NUMBER AS
    VAR RES INT; N_PATH VARCHAR(4000); MSG VARCHAR(1000); L_EMPDSTARTCHR TIMESTAMP;
BEGIN
    IF UNITDIVISIONID IS NULL OR EMPCOMPANYID IS NULL OR EMPHUMANRESOURCEID IS NULL OR
            EMPDSTARTCHR IS NULL THEN
        RETURN 0;        
        
    SET L_EMPDSTARTCHR = EMPDSTARTCHR;
    
    TRY              
        IF F_UD_LTD IS NOT NULL AND F_UD_LTD='T' THEN
            SELECT 1 INTO :RES
              FROM
                    PSF.UNIT_DIVISION B
                   ,PSF.COMPANY_HR_ROLE A
             WHERE
                   DATE(VALUE(DATE(B.D_END),ADDDATE(TIMESTAMP,1)))>DATE(TIMESTAMP)
               AND DATE(B.D_START)<=DATE(TIMESTAMP)
               AND B.K_UNIT_DIVISION=A.E_U_DIV_K_UNIT_DIVISION
               AND DATE(VALUE(DATE(A.D_END),ADDDATE(TIMESTAMP,1)))>DATE(TIMESTAMP)
               AND DATE(A.D_START)<=DATE(TIMESTAMP)
               AND A.E_ROLE_TYP_K_ROLE_TYPE=VALUE(:ROLETYPEID,A.E_ROLE_TYP_K_ROLE_TYPE)
               AND A.E_U_DIV_K_UNIT_DIVISION=:UNITDIVISIONID
               AND A.E_COMP_HR_K_COMPANY=:EMPCOMPANYID
               AND A.E_COMP_HR_K_HUMAN_RESOURCE=:EMPHUMANRESOURCEID
               AND DATE(A.E_COMP_HR_D_START)=DATE(:L_EMPDSTARTCHR)
               AND ROWNO<=1
        ELSE
            BEGIN
                SELECT 1 INTO :RES
                  FROM  PSF.COMPANY_HR_ROLE A
                        INNER JOIN PSF.UNIT_DIVISION B
                        ON A.E_U_DIV_K_UNIT_DIVISION = B.K_UNIT_DIVISION
                 WHERE
                       DATE(VALUE(DATE(B.D_END),ADDDATE(TIMESTAMP,1)))>DATE(TIMESTAMP)
                   AND DATE(B.D_START)<=DATE(TIMESTAMP)
                   AND UNIT_DIVISION_ANCESTOR(B.K_UNIT_DIVISION) = :UNITDIVISIONID
                   AND DATE(VALUE(DATE(A.D_END),ADDDATE(TIMESTAMP,1)))>DATE(TIMESTAMP)
                   AND DATE(A.D_START)<=DATE(TIMESTAMP)
                   AND 
A.E_ROLE_TYP_K_ROLE_TYPE=VALUE(:ROLETYPEID,A.E_ROLE_TYP_K_ROLE_TYPE)
                   AND A.E_COMP_HR_K_COMPANY=:EMPCOMPANYID
                   AND A.E_COMP_HR_K_HUMAN_RESOURCE=:EMPHUMANRESOURCEID
                   AND DATE(A.E_COMP_HR_D_START)=DATE(:L_EMPDSTARTCHR)
                   AND ROWNO<=1;
            END;
        RETURN 1;
    CATCH
        IF $RC <> 100 THEN
           STOP($RC,$ERRMSG)
        ELSE RETURN 0;
END;

where 

CREATE FUNCTION UNIT_DIVISION(C NUMBER) RETURNS NUMBER AS
  VAR FATHER FIXED(9,0); CHILD FIXED(9,0);
TRY

  SET CHILD = C;

  WHILE 1 = 1 DO
  BEGIN
    SELECT E_U_DIV_K_UNIT_DIVISION
      INTO :FATHER
      FROM PSF.UNIT_DIVISION
     WHERE
           K_UNIT_DIVISION = :CHILD
       AND D_END IS NULL;

    IF FATHER IS NULL THEN
      RETURN CHILD;

    SET CHILD = FATHER;
  END;

  RETURN FATHER;

CATCH
  IF $RC <> 100 THEN STOP($RC, $ERRMSG)
  ELSE RETURN CHILD;
//

Recreating all the procedure at once, the first time a submit the statement

SELECT
1
FROM
dual
WHERE
1=isEmpInAggregation(to_number('200004'), NULL,to_number('1'), 
to_number('200002'),to_date('21-05-2004','dd/mm/yyyy'))

I receive the error 'Numeric value out of range;-3019 Invalid exponent.'
>From that moment on, everything goes ok.....but using Java I receive the same error
'exception [-3019]: Invalid exponent'.

Why a SQL statement goes with SQL Studio and doesn't with Java?
Why the first time the statement goes wrong and then everything is ok?
What's my mistake?

If you need trace or everything else, just ask me.

Thanks,
   Matteo

Reply via email to