Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1126 connectés 

  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  Appel d'une procedure stockée

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Appel d'une procedure stockée

n°1262307
lapartdomb​re
Posté le 09-12-2005 à 09:13:21  profilanswer
 

Bonjour j'ai une procédure stockée qui me sort en paramètre de sortie un tableau d'enregistrement.
 

Code :
  1. TYPE T_REC_TEST IS RECORD (
  2.    libelleCTC VARCHAR2(20),
  3.    resteCoupure VARCHAR2(20),
  4.    stock VARCHAR2(20),
  5.    traficTrie VARCHAR2(20),
  6.    tauxReste VARCHAR2(20));
  7. -- Table de records --
  8. TYPE TAB_T_REC_TEST IS TABLE OF T_REC_TEST INDEX BY BINARY_INTEGER ;
  9. PROCEDURE P_TB_TEST2(PDI_JOURNEE_POSTALE IN DATE, PTO_TEST OUT TAB_T_REC_TEST)
  10. IS
  11.     -- curseur
  12. v_cur Pkg_Tableaux_Bord_Reste.r_cursor;
  13. -- variables
  14. fileHandler UTL_FILE.FILE_TYPE;
  15. resteCoupure INTEGER;
  16. stock INTEGER;
  17. traficTrie INTEGER;
  18. codeCTC CHAR(6);
  19. libelleCTC VARCHAR2(20);
  20. idCTC INTEGER;
  21. --PTO_ECO_DEP TAB_T_REC_ECO_DEP;
  22. indice INTEGER;
  23. BEGIN
  24. -- Ouverture du fichier de log
  25. fileHandler := UTL_FILE.FOPEN('TRC_DIR', 'ECO_DEPART.LOG', 'w');
  26. indice := 1;
  27.     -- recupération de la liste des établissements
  28. P_GET_ETAB_STOCK_RESTE (v_cur,PDI_JOURNEE_POSTALE);
  29.     LOOP
  30.       FETCH v_cur INTO codeCTC , libelleCTC, idCTC;
  31.         EXIT WHEN v_cur%NOTFOUND;
  32.  PTO_TEST(indice).libelleCTC := libelleCTC;
  33.  P_GET_RESTE_BY_ETAB (idCTC, -- id du ctc
  34.                       '2', -- code catégorie "Ecopli"
  35.        1, -- code niveau_tri "Départ"
  36.        PDI_JOURNEE_POSTALE,
  37.        resteCoupure);
  38.  P_GET_STOCK_MACROPT_BY_ETAB (idCTC, -- id du ctc
  39.                               '2', -- code catégorie "Ecopli"
  40.           1, -- code niveau_tri "Départ"
  41.           PDI_JOURNEE_POSTALE,
  42.           stock);
  43.  P_GET_TRAFIC_TRIE_CAT_BY_ETAB (idCTC, -- id du ctc
  44.                                 '2', -- code catégorie "Ecopli"
  45.                1, -- code niveau_tri "Départ"
  46.                PDI_JOURNEE_POSTALE,
  47.               traficTrie);
  48.  PTO_TEST(indice).resteCoupure := '' || resteCoupure;
  49.  PTO_TEST(indice).stock := '' || stock;
  50.  PTO_TEST(indice).traficTrie := '' ||  traficTrie;
  51.  IF (traficTrie IS NOT NULL AND traficTrie != 0) THEN
  52.     PTO_TEST(indice).tauxReste := '' ||  (stock /traficTrie);
  53.  ELSE
  54.   PTO_TEST(indice).tauxReste := '0';
  55.  END IF;
  56.  indice := indice + 1;
  57. END LOOP;
  58. CLOSE v_cur;
  59. FOR i IN 1..PTO_TEST.COUNT LOOP
  60.  UTL_FILE.PUT_LINE(fileHandler, ' **** code : ' || PTO_TEST(i).libelleCTC);
  61.  UTL_FILE.PUT_LINE(fileHandler, ' **** reste : ' || PTO_TEST(i).resteCoupure);
  62.  UTL_FILE.PUT_LINE(fileHandler, ' **** stock : ' || PTO_TEST(i).stock);
  63.  UTL_FILE.PUT_LINE(fileHandler, ' **** trie : ' || PTO_TEST(i).traficTrie);
  64.  UTL_FILE.PUT_LINE(fileHandler, ' **** taux Reste : ' || PTO_TEST(i).tauxReste);
  65.     END LOOP;
  66. -- Fermeture du fichier de log
  67. UTL_FILE.FCLOSE(fileHandler);
  68. EXCEPTION
  69. WHEN utl_file.invalid_path THEN
  70.   RAISE_APPLICATION_ERROR(-20000, 'Erreur: répertoire / nom de fichier invalide');
  71. WHEN OTHERS THEN
  72.   RAISE;
  73. END P_TB_TEST2;


 
 
Je cherche à faire appel de cette procédure stockée à partir de mon code C#
 

Code :
  1. public void test2()
  2.  {
  3.   OracleConnection myConnection = new OracleConnection();
  4.   try
  5.   {
  6.    string strConn = "user id=HGADEV_AA5;data source=BOUCLAGE_V3;password=HGADEV_AA5";
  7.    myConnection.ConnectionString = strConn;
  8.    myConnection.Open();
  9.    OracleCommand cmd = new OracleCommand( "PKG_TABLEAUX_BORD_RESTE.P_TB_TEST2", myConnection);
  10.    cmd.CommandType=CommandType.StoredProcedure;
  11.    OracleParameter Param1 = new OracleParameter();
  12.    Param1.OracleDbType = OracleDbType.Date;
  13.    Param1.Direction = ParameterDirection.Input;
  14.    Param1.Value= "15/11/2005";
  15.    OracleParameter Param2 = new OracleParameter();
  16.    Param2.OracleDbType = OracleDbType.Varchar2;
  17.    Param2.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
  18.    Param2.Direction = ParameterDirection.Output;
  19.    Param2.Value = null;
  20.    int max = 3;
  21.    int maxVarChar = 20;
  22.    int [] tbOracle = new int[max];
  23.    for (int i=0; i<tbOracle.Length; i++)
  24.    {
  25.     tbOracle[i]=maxVarChar;
  26.    }
  27.    Param2.ArrayBindSize = tbOracle;
  28.    cmd.Parameters.Add(Param1);
  29.    cmd.Parameters.Add(Param2);
  30.    cmd.ExecuteNonQuery();
  31.    System.Console.WriteLine(cmd.Parameters[1].Value);
  32.   }
  33.   catch (Exception ex)
  34.   {
  35.    string err = ex.StackTrace;
  36.   }
  37.   finally
  38.   {
  39.    myConnection.Close();
  40.   }
  41.  }


 
 
Mais ca ne fonctionne pas très bien car en fait je ne peux pas définir à l'avance le nombre d'éléments de mon tableau d'enregistrement et du coup je ne peux pas renseigner le  Param2.ArrayBindSize...
 
Est ce que certaines personnes ont déjà réliser ce genre d'appel.

mood
Publicité
Posté le 09-12-2005 à 09:13:21  profilanswer
 

n°1262406
_Mose_
Lonesome coder
Posté le 09-12-2005 à 11:07:38  profilanswer
 

Au lieu de ExecuteNonQuery(), tu devrais essayer ExecuteReader(), ça te retourne un DataReader sur lequel tu peux faire une boucle pour lire les résultats.
 
Exemple à 0,30 euros :

Code :
  1. // appeller 'ExecuteReader()'
  2. using(System.Data.SqlClient.SqlDataReader reader = command.ExecuteReader())
  3. {
  4. // si le reader n'est pas null
  5. if(reader != null)
  6. {
  7.  // tant qu'on est pas au bout
  8.  while(reader.Read())
  9.  {
  10.   // lecture d'un DataRow :
  11.   // pour chaque champs, afficher toutes les valeurs
  12.   for(int i = 0; i < reader.FieldCount;i++)
  13.    output = string.Concat(output, reader[i].ToString(), "  " );
  14.   output = string.Concat(output, "\n" );
  15.  }
  16. }
  17. }


---------------
Tout est normal, suffit de comprendre pourquoi.
n°1262454
lapartdomb​re
Posté le 09-12-2005 à 11:44:04  profilanswer
 

J'avais essayer mais ca ne marcher pas non plus sur un tableau d'enregistrements mais je vais refaire des tests

n°1262625
_Mose_
Lonesome coder
Posté le 09-12-2005 à 14:57:31  profilanswer
 

Au risque de paraitre tétu: c'est à ça que ça sert.
 
Je suis pas le super-spécialiste de SQL Server, mais pour faire fonctionner le ExecuteReader(), il me semble qu'il faut un SELECT dans ta proc.
Si tu peux essayer :
1 - De virer le paramètre OUT de la proc (PTO_TEST)
2 - De le remplacer par une variable locale
3 - De finir ta proc par un SELECT * FROM ta variable locale
Ca devrait fonctionner.


---------------
Tout est normal, suffit de comprendre pourquoi.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  Appel d'une procedure stockée

 

Sujets relatifs
Appel d'un script depuis un autre[C++]appel de fonction pure
récupérer commande create procedure[SQL] créer une vue avec une procedure stockée ?
procédure de relanceBouton et appel fonction
Erreur lors de la creation d'une procedure stockéeAppel Procédure Stockée Access depuis WinForm VB .Net en OLEDB
Appel procedure stockee avec webspherePb appel procédure stockée oracle
Plus de sujets relatifs à : Appel d'une procedure stockée


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR