Appel d'une procedure stockée

Appel d'une procedure stockée - C#/.NET managed - Programmation

Marsh Posté le 09-12-2005 à 09:13:21    

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.

Reply

Marsh Posté le 09-12-2005 à 09:13:21   

Reply

Marsh Posté le 09-12-2005 à 11:07:38    

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.
Reply

Marsh Posté le 09-12-2005 à 11:44:04    

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

Reply

Marsh Posté le 09-12-2005 à 14:57:31    

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.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed