1

私は学校の課題に取り組んでおり、コードにエラーがあります。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) です。

4

1 に答える 1

3

問題は、テーブル タイプが BINARY_INTEGER によってインデックス化されていることだと思われます。.EXISTSコールが実行されると、コールはdep1またはdep2テーブルのインデックスとして渡されるため、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;

共有してお楽しみください。

于 2012-08-15T17:04:00.927 に答える