2012-08-15 59 views
1

我正在學習工作,並在代碼中出現錯誤。 我創建了一個PLSQL包:VARCHAR2通過作爲參數傳遞給函數而成爲數字

create or replace 
PACKAGE GestionProjets AS 

    TYPE Signaletique IS TABLE OF EMPLOYES%ROWTYPE INDEX BY BINARY_INTEGER; 
    TYPE TableNomDep IS TABLE OF VARCHAR2(40); 

    PROCEDURE AjouterProjets(ProjetRecord IN PROJETS%ROWTYPE); 
    PROCEDURE SupprimerProjet(DelNumPro IN PROJETS.numpro%TYPE); 
    --PROCEDURE ModifierProjet(newRecord IN PROJETS%ROWTYPE, oldRecord IN PROJETS%ROWTYPE); 
    FUNCTION ListerEmployes(dep1 IN DEPARTEMENTS.Nomdep%TYPE, dep2 IN DEPARTEMENTS.Nomdep%TYPE) RETURN Signaletique; 

END GestionProjets; 

這是該函數的身體,我有一個錯誤:

FUNCTION ListerEmployes(dep1 IN DEPARTEMENTS.Nomdep%TYPE, dep2 IN DEPARTEMENTS.Nomdep%TYPE) RETURN Signaletique AS 

    nomDeps TableNomDep; 
    SigTable Signaletique; 
    EXWrongDep1 EXCEPTION; 
    EXWrongDep2 EXCEPTION; 

    BEGIN 

    SELECT Nomdep 
    BULK COLLECT INTO nomDeps 
    FROM DEPARTEMENTS; 

    -- test if dep 1 est un parametre valide 
    IF NOT nomDeps.exists(dep1) THEN 
     RAISE EXWrongDep1; 
    END IF; 

    -- test if dep 2 est un parametre valide 
    IF NOT nomDeps.exists(dep2) THEN 
     RAISE EXWrongDep2; 
    END IF; 




    EXCEPTION 
     WHEN EXWrongDep1 THEN 
     RAISE_APPLICATION_ERROR(-20008, 'MAUVAIS PARAMETRE: ' || dep1 || ' N EXISTE PAS!'); 
     WHEN EXWrongDep2 THEN 
     RAISE_APPLICATION_ERROR(-20008, 'MAUVAIS PARAMETRE: ' || dep2 || ' N EXISTE PAS!'); 
      WHEN OTHERS THEN 
       RAISE_APPLICATION_ERROR (-20007, 'ERREUR INCONNU: ' || SQLCODE || ' - ' || SQLERRM); 

    END ListerEmployes; 

當我試圖執行的功能,我收到此錯誤信息:

DECLARE 
    tabel gestionprojets.Signaletique; 
BEGIN 
    tabel := gestionprojets.listeremployes('sdsd','sdsd'); 
END; 


ORA-20007: ERREUR INCONNU: -6502 - ORA-06502: PL/SQL: numeric or value error: character to number conversion error 
ORA-06512: at "EDGE.GESTIONPROJETS", line 108 
ORA-06512: at line 4 

我不明白爲什麼我會收到此錯誤消息。 Nomdep列的類型是VARCHAR2(40)。

回答

3

我懷疑問題是表類型是由BINARY_INTEGER索引的。當執行.EXISTS調用時,它們會通過dep1dep2作爲表的索引,因此PL/SQL會嘗試將VARCHAR2(40)參數轉換爲BINARY_INTEGER。由於這些輸入參數都是非數字字符串('sdsd'),所以轉換失敗。

此代碼可能會運行,而不是讀取整個表DEPARTEMENTS到內存每次ListerEmployes更快如果被調用,它被改寫爲

FUNCTION ListerEmployes(dep1 IN DEPARTEMENTS.Nomdep%TYPE, dep2 IN DEPARTEMENTS.Nomdep%TYPE) RETURN Signaletique 
AS 
    strNomdep DEPARTEMENTS.Nomdp%TYPE; 
BEGIN 
    -- test if dep 1 est un parametre valide 

    BEGIN 
    SELECT NOMDEP 
     INTO strNomdep 
     FROM DEPARTEMENTS 
     WHERE NOMDEP = dep1; 
    EXCEPTION 
    WHEN NO_DATA_FOUND THEN 
     RAISE_APPLICATION_ERROR(-20008, 'MAUVAIS PARAMETRE: ' || dep1 || ' N EXISTE PAS!'); 
    END; 

    -- test if dep 2 est un parametre valide 

    BEGIN 
    SELECT NOMDEP 
     INTO strNomdep 
     FROM DEPARTEMENTS 
     WHERE NOMDEP = dep2; 
    EXCEPTION 
    WHEN NO_DATA_FOUND THEN 
     RAISE_APPLICATION_ERROR(-20008, 'MAUVAIS PARAMETRE: ' || dep2 || ' N EXISTE PAS!'); 
    END; 
    EXCEPTION 
    WHEN OTHERS THEN 
     RAISE_APPLICATION_ERROR (-20007, 'ERREUR INCONNU: ' || SQLCODE || ' - ' || SQLERRM);  
END ListerEmployes; 

分享和享受。

+0

謝謝你,這是一個非常愚蠢的錯誤。打擾一下。 – Mischa 2012-08-15 17:37:47

+1

@Mischa - 我不認爲這是「愚蠢的」。每個人有時都會這樣做。你有問題,你問了一個問題,你有答案。所以它... – 2012-08-15 17:41:05

相關問題