IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PL/SQL Oracle Discussion :

[10g] - ADO.net - C# 3.5 Paramètre de sortie pour remplir un datareader


Sujet :

PL/SQL Oracle

  1. #1
    CUCARACHA
    Invité(e)
    Par défaut [10g] - ADO.net - C# 3.5 Paramètre de sortie pour remplir un datareader
    Salut,

    J'ai un problème avec une procédure qui est censée récupérer (ou créer) un enregistrement pour le retourner dans un datareader.

    Je sais que je pourrais ne pas utiliser un datareader mais j'aimerais comprendre pourquoi ça ne fonctionne pas.

    Voici l'extrait du package (je precise que le package compile et la procedure s'execute dans TOAD).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
     
    PROCEDURE GetCreate_BHR_BREACH_MAIN(
        pISIN IN VARCHAR2,
        pPTF_ID IN VARCHAR2 := null,
        pBHR_BREACH_MAIN_Row OUT SYS_REFCURSOR
    )
    IS
        vID_BREACH_MAIN NUMBER := null;
        vRETURN_CURSOR SYS_REFCURSOR;
    BEGIN
        IF(pPTF_ID is null) THEN
            BEGIN
            SELECT 
                BHR_BREACH_MAIN.ID_BREACH_MAIN 
            INTO 
                vID_BREACH_MAIN 
            FROM 
                BHR_BREACH_MAIN 
            WHERE 
                BHR_BREACH_MAIN.ISIN = pISIN AND BHR_BREACH_MAIN.PTF_ID is null;   
                exception
                    when NO_DATA_FOUND then
                        vID_BREACH_MAIN := null;
                    when OTHERS then
                        RAISE;
            END;
        ELSE
            BEGIN
                SELECT 
                    BHR_BREACH_MAIN.ID_BREACH_MAIN 
                INTO 
                    vID_BREACH_MAIN 
                FROM 
                    BHR_BREACH_MAIN 
                WHERE 
                    BHR_BREACH_MAIN.ISIN = pISIN AND BHR_BREACH_MAIN.PTF_ID = pPTF_ID;   
                exception
                    when NO_DATA_FOUND then
                        vID_BREACH_MAIN := null;
                    when OTHERS then
                        RAISE;
            END;
        END IF;
     
        IF (vID_BREACH_MAIN is null) THEN
            --Il faut créer l'enregistrement avant
            INSERT INTO BHR_BREACH_MAIN ( 
                ISIN,
                PTF_ID,
                IS_ARCHIVED
            ) VALUES (
                pISIN,
                pPTF_ID,
                'N'
            ) returning BHR_BREACH_MAIN.ID_BREACH_MAIN into vID_BREACH_MAIN;
        END IF;
     
        OPEN vRETURN_CURSOR FOR
            SELECT
                B.*
            FROM 
                BHR_BREACH_MAIN B
            WHERE
                B.ID_BREACH_MAIN = vID_BREACH_MAIN;
     
        pBHR_BREACH_MAIN_Row := vRETURN_CURSOR;        
    END;
    voici le bout de code C#

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
                oCmd.CommandText = "FIR1.PAK_BHR.ClosePositionPeriod";
                foreach (var P in PeriodsToClose)
                {
                    oCmd.Parameters.Clear();
                    oCmd.Parameters.AddWithValue("pISIN", P.ISIN);
                    oCmd.Parameters.AddWithValue("pPTF", P.Portfolio);
                    oCmd.Parameters.AddWithValue("pThresholdType", Tools.EnumTypeTo<int>(P.ThresholdType));
                    oCmd.ExecuteNonQuery();            
                }
                oCmd.CommandText = "FIR1.PAK_BHR.GetCreate_BHR_BREACH_MAIN";
                foreach (var Threshold in Thresholds) {
                    oCmd.Parameters.Clear();
                    oPmt = new OracleParameter();
                    oPmt.DbType = DbType.String;
                    oPmt.IsNullable = false;
                    oPmt.OracleType = OracleType.NVarChar;
                    oPmt.ParameterName = "pISIN";
                    oPmt.Value = Threshold.ISIN;
                    oPmt.Direction = ParameterDirection.Input;
                    oCmd.Parameters.Add(oPmt);
     
                    oPmt = new OracleParameter();
                    oPmt.DbType = DbType.String;
                    oPmt.IsNullable = true;
                    oPmt.OracleType = OracleType.NVarChar;
                    oPmt.ParameterName = "pPTF_ID";
                    if (Threshold.Portfolio == null)
                    {
                        oPmt.Value = DBNull.Value;
                    }
                    else
                    {
                        oPmt.Value = Threshold.Portfolio;
                    }
                    oPmt.Direction = ParameterDirection.Input;
                    oCmd.Parameters.Add(oPmt);
     
                    oCmd.Parameters.Add("pBHR_BREACH_MAIN_Row", OracleType.Cursor).Direction = ParameterDirection.Output;
                    oDr = oCmd.ExecuteReader();
                    if (oDr.Read())
                    {
                        pID_BREACH_MAIN = int.Parse(oDr["ID_BREACH_MAIN"].ToString());
                    }
    J'avoue que je cale...

    D'avance merci pour votre aide,

    Laurent

  2. #2
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Bref, j'ai trouvé en exemple ici et il me semble qu'il te manque un New, mais tu sais bien que cette fois c'est moi celui qui se connait au foot.
    myCMD.Parameters.Add(New OracleParameter("io_cursor", OracleType.Cursor)).Direction = ParameterDirection.Output
    Sinon supprime dans ta procédure PL/SQL le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     when OTHERS then
                        RAISE;
    qui ne sert strictement au rien.

    De plus vérifier que l'enregistrement existe avant de l'insérer avec Oracle de la manière faite dans ton code est un exemple typique de non compréhension des mécanismes d'Oracle à ce niveau.

  3. #3
    CUCARACHA
    Invité(e)
    Par défaut
    Ah mais je revendique de ne rien comprendre à Oracle... Lorsqu'il manque un enregistrement, il te dit qu'il y a une erreur de type, lorsqu'il y a une erreur de type il te donne l'age du capitaine...

    Bref, je perds vraiement beaucoup de temps...

    Sinon, tu peux peut-être me faire comprendre ce que je n'ai pas saisi, non ?

    Citation Envoyé par mnitu Voir le message
    Bref, j'ai trouvé en exemple ici et il me semble qu'il
    Pour le new, j'ai utilisé cette syntaxe ailleur, elle fonctionne. Le plus rigolo, c'est que ça passe une fois puis ca plante la seconde. Je prends exactement les mêmes paramètres lors de la seconde execution et paf, ca marche dans toad...

    C'est dans ces moments là que j'aimerais être un inquisiteur du 12 ème sciècle et tenir un concepteur d'Oracle accusé d'hérésie...
    Dernière modification par Chtulus ; 16/06/2010 à 12h29. Motif: Pensez à éditer vos messages !

  4. #4
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Salut Laurent,

    Je te propose d’avancer doucement pour l’instant et ensuite on reviendra sur divers choses. Le problème que t’as n’est pas un problème d’oracle. Ta procédure Pl/SQL fonctionne et donc les problèmes sont ailleurs, dans l’utilisation de la procédure probablement dans ton C# ; mais je ne maitrise pas C#.
    Maintenant est-ce que tu as de problème avec cette procédure en TOAD quand tu l’exécute N fois ? Sinon tous les problèmes sont en C# et associés (.Net ou driver, etc.) et il vaut voire de cette coté.

    [Edit]
    Voilà un autre lien (chez Oracle cette fois)
    [/Edit]

  5. #5
    CUCARACHA
    Invité(e)
    Par défaut
    Hello...

    M E A C U L P A !...

    Je me suis suicidé 6 fois du septème étage pour être sur de me faire mal...

    La procédure et le code C# fonctionnent très bien c'est moi qui ait fait une ENNORME erreur d'étourderie...

    Le tout s'exécutait dans une boucle et j'ai fait une erreur d'initialisation du commandText du coup, j'executait la procédure d'un package avec les paramètres d'une autre proc.

    Dès que mon sang aura fini de s'écouler dans la baignoire, je reviens vers vous...

  6. #6
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Laurent
    J'espère qu'il y avait aussi un bug quelque parte dans tes intentions sanguinaires!

    Je suis très content pour toi! Je suis persuadé que petit à petit ton appréhension envers Oracle va disparaître pour laisse place a une vraie histoire d'amour.

    • When Others Then Raise – le problème avec ce code est que c'est du n'importe quoi. Toute exception est attrapé pour être ensuite ré-levée. Mais, le problème est que si tu n'écrit pas ce morceaux de code c'est exactement la même chose qui va se passer, sans certains effet de bord qui parfois font un peu mal. Pour te donner une règle simple: intercepte seulement les exceptions pour lequel t'envisage à faire quelque chose, autrement dite que tu sais traiter. Les autres laisse les filler jusqu'au niveau où pareil, on se faire quelque chose avec.
    • When NO_DATA_FOUND THEN var := Null – personnellement j'ajoute toujours un commentaire pour dire: oui, c'est cas peut arriver je suis bien conscient de ça et oui, je n'ai pas oublier de ré-lever l'exception.
    • Vérifier par un SELECT que l'enregistrement qu'on est en train d'insérer existe déjà: le niveau d'isolation des transactions par défaut en Oracle est Read Commited. Cella à pour conséquence qu'il est inutile et erroné de vérifier l'existence d'un enregistrement avant de l'insérer, sauf si on est en mono utilisateur – mais, qui développe des applications en mono utilisateur avec Oracle !?
      En fait, si dans une autre session, un autre utilisateur exécute la même procédure avec les mêmes paramètres sans faire le commit, la session courante ne voit pas l'enregistrement en doublon. Au moment du commit dans une de deux sessions soit il aurait une Exception de type DUP_VAL_ON_INDEX si un index unique approprié existe, soit il y aurait toute simplement un doublon.

  7. #7
    CUCARACHA
    Invité(e)
    Par défaut J'apprécie les packages
    C'est vrai qu'avec le temps on s'y fait.

    Un truc que j'aime beaucoup c'est la notion de package qui manque dans SQL Server mais c'est de moins en moins utile avec la vulgarisation des modèles relationnels objet.

    J'aime aussi beaucoup le traitement hiérarchique qui est vraiement moisi dans SQL Server.

    Je préfère l'approche de SQL Pro : http://sqlpro.developpez.com/cours/arborescence/

    Qui est très efficace.

    Ce que je n'aime pas :
    AMC Designer ou TOAD qui créent des script qui plantent presque à chaque fois.

    Les limitations dans les longueurs des noms (ça c'est vraiement débile grave profond pénible voir insupportable).

    L'indépendance à la casse des noms.

    La très mauvaise qualité de la documentation en ligne au regard de la doc SQL Server (mais là c'est difficile d'être objectif).

    l'ésothérisme que font planer les DBA Oracle autour du ou des produits qu'ils administrent pour préserver leur près carré.

    ++

    Laurent
    P.S. Je mets résolu mais je serais heureux de participer à un débat SQL Server 2008 vs ORACLE 12.

  8. #8
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Une critique du modèle utilisé par SQL Pro se trouve ici (chapter seven). De plus, Stéphane Faroult est une des rares auteurs capable de parler d’Oracle, SQL Server, Db2 et My SQL sans complexes.

    Un débat Oracle vs Sql Server ne sert à rien dans mon opinion. Il est toujours plus utile de comprendre la philosophie de chaque produit pour mieux l’utiliser que de se lancer dans des débats stériles sur qui est le meilleur.

  9. #9
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 394
    Points
    18 394
    Par défaut
    Citation Envoyé par Laurent Jordi Voir le message
    J'aime aussi beaucoup le traitement hiérarchique qui est vraiement moisi dans SQL Server.

    Je préfère l'approche de SQL Pro : http://sqlpro.developpez.com/cours/arborescence/
    Les requêtes récursives type CTE sont implémentées en 11gR2, et pour certains besoins elles sont nécessaires car font plus de choses que les requêtes CONNECT BY, même si ce dernier est satisfaisant dans la très grande majorité des cas.


    Citation Envoyé par Laurent Jordi Voir le message
    Les limitations dans les longueurs des noms (ça c'est vraiement débile grave profond pénible voir insupportable).
    Oh que je suis d'accord !

    Citation Envoyé par Laurent Jordi Voir le message
    L'indépendance à la casse des noms.
    Vous pouvez utiliser les doubles quotes pour les rendre dépendants :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    create table toto
    as select * from dual;
    -- Table created
     
    select * from toto;
    X
     
    select * from TOTO;
    X
     
    select * from TotO;
    X
     
    SELECT * FROM "toto";
    -- ORA-00942: Table ou vue inexistante
     
    SELECT * FROM "TOTO";
    X
     
    SELECT * FROM "TotO";
    -- ORA-00942: Table ou vue inexistante
     
    drop table toto;
    -- Table dropped
     
    create table "TotO"
    as select * from dual;
    -- Table created
     
    select * from toto;
    -- ORA-00942: Table ou vue inexistante
     
    select * from TOTO;
    -- ORA-00942: Table ou vue inexistante
     
    select * from TotO;
    -- ORA-00942: Table ou vue inexistante
     
    select * from "toto";
    -- ORA-00942: Table ou vue inexistante
     
    select * from "TOTO";
    -- ORA-00942: Table ou vue inexistante
     
    select * from "TotO";
    X
     
    drop table "TotO";
    -- Table dropped
    Citation Envoyé par Laurent Jordi Voir le message
    La très mauvaise qualité de la documentation en ligne au regard de la doc SQL Server (mais là c'est difficile d'être objectif).
    Euh ? Là je ne comprends pas, les documentations Oracle sont nettement plus complètes que celles de SQL Server.
    Entre tahiti, les forums OTN (oracle technology network), metalink/MOS (My Oracle Support) et asktom, c'est très complet.

  10. #10
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 394
    Points
    18 394
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Une critique du modèle utilisé par SQL Pro se trouve ici (chapter seven). De plus, Stéphane Faroult est une des rares auteurs capable de parler d’Oracle, SQL Server, Db2 et My SQL sans complexes.
    fsmrel a aussi largement abordé la supériorité du modèle parent / enfant sur ce sujet :
    http://www.developpez.net/forums/d91...s/#post5205169

  11. #11
    CUCARACHA
    Invité(e)
    Par défaut
    Le modèle parent enfant est bien en injection mais nul en selection (c'est mon retour d'expérience mais je ne suis pas expert en base de données).

  12. #12
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Euh ? Là je ne comprends pas, les documentations Oracle sont nettement plus complètes que celles de SQL Server.
    Entre tahiti, les forums OTN (oracle technology network), metalink/MOS (My Oracle Support) et asktom, c'est très complet.
    Ouais je suis d'accord. Étant passer d'Oracle à SQL Server, je le constate régulièrement.
    Un exemple sous MSDN : les scripts d'exemple dans la documentation sont régulièrement incomplets voir faux ou farfelues... Débuggé l'exemple... Certes, c'est formateur.
    La constance de la documentation Oracle reste exemplaire.

  13. #13
    CUCARACHA
    Invité(e)
    Par défaut
    Ok, je garde les bonnes adresses merci...

    Un grosse mauvaise surprise, je suis un aficionado d'Entity Framework, j'ai fait une démo chez mon client, mon chef a demandé à l'Archi de nous procurer un connecteur Entity Framework pour Oracle et là, GROS coup de massue au niveau des licences. Du coup... On va migrer à SQL Serveur car le gain de productivité du couple SQL Server / Entity Framework est tel, qu'il revient impossible de justifier l'utilisation d'Oracle (en tous les cas pour le type de base qu'on utilise).

    D'après vous un connecteur gratos est-il prévu ?

    D'avance merci

    Laurent

Discussions similaires

  1. Réponses: 1
    Dernier message: 26/11/2014, 11h57
  2. [ADO.Net/C# 2.0]Comment coder ObjectDataSource pour Design?
    Par NeoMan dans le forum Accès aux données
    Réponses: 3
    Dernier message: 22/02/2006, 16h04
  3. [ADO.Net][C# 1.1]Comment réaliser relation pour 2 Dataset ?
    Par misa dans le forum Accès aux données
    Réponses: 2
    Dernier message: 07/01/2006, 07h55
  4. [ADO.Net][C#/Oracle] Comment utiliser une requête paramètrée ?
    Par kaboume dans le forum Accès aux données
    Réponses: 4
    Dernier message: 05/07/2005, 15h50
  5. [VB.NET] [ADO.NET] Requête paramétrée
    Par DotNET74 dans le forum Accès aux données
    Réponses: 2
    Dernier message: 11/03/2005, 09h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo