VARCHAR2通过将as参数传递给函数来变为Numeric

时间:2012-08-15 16:46:51

标签: oracle plsql

我正在从事学校工作,我的代码中有错误。 我创建了一个PLSQL包:

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)。

1 个答案:

答案 0 :(得分: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;

分享并享受。