1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    octobre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2010
    Messages : 9
    Points : 6
    Points
    6

    Par défaut Type ANYDATA : Manipulation d'un attribut de type INTEGER

    Bonjour tout le monde,
    Sous Oracle 11gR2.
    J'ai créer une function générique qui recoit 2 variables de type ANYDATA en entrée
    ( elle sont à l'origine de même TYPE appelé ROBJET1 ) et qui revoie également un ROBJET1.
    En fait à partir des ces 2 paramètres et suivant des règles métiers on constitue un 3ième qui est retourné
    au programme appelant.

    Le problème c'est que je n'arrive pas à lire ( et à écrire) les attributs de TYPE INTEGER du type ROBJET1
    Il existe bien des méthodes get(set)Number, get(set)Date, get(set)VARCHAR2....
    ( getNumber plan le code PL*SQL )

    Q1 - Comment récupérer cet attribut de type INTEGER ?

    Autres questions / ANYDATA :
    Q2 - pourrait-on mettre à jour une des 2 variables passées en paramètre ( ceci permettrait de ne pas devoir créer une 3ième ) ?

    Merci à vous
    Cordialement

  2. #2
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    octobre 2007
    Messages
    5 535
    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 535
    Points : 11 332
    Points
    11 332

    Par défaut

    Quand j'entend générique cela me donne toujours des migraines!
    Essayer via un exemple simple mais concret de nous expliquer les données que vous avez en entrée et celles que vous devrait avoir en sortie et de détailler sur ce que vous désirez accomplir.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    octobre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2010
    Messages : 9
    Points : 6
    Points
    6

    Par défaut

    Bonsoir,
    pour info une partie du code provient d'un article "Les types opaques sous Oracle 9i" par Laurent Dardenne
    bon effectivement il date de 2010... mais j'avais espéré qu'Oracle avait fait évoluer des TYPE !! et les méthodes associées
    ci-dessous le code complet ( TYPE, function packagée, script SQL ).

    Lorsque je n'ai pas d'attribut INTEGER dans le TYPE passé en paramètre tout se passe à merveille.
    Je doit pouvoir lancer cette fonction avec n'importe quel
    TYPE qui est utilisé dans une application existante - donc je ne peut pas modifier les TYPE.

    Encore une fois je suis étonné que dans les doc Oracle il n'y a pas de méthode getInteger ou setInteger !!!!
    Mais il y a peut-être un autre moyen pour lire la valeur d'un attribut INTEGER.

    Merci de votre aide.

    Le code du TYPE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     CREATE OR REPLACE TYPE "ZZ_UDT_A" AS OBJECT
    (
    A    VARCHAR2(10),
    N    NUMBER,
    I    INTEGER ,
    D    DATE,
    CONSTRUCTOR FUNCTION ZZ_UDT_A RETURN SELF AS RESULT
    );
    /
    CREATE OR REPLACE TYPE BODY "ZZ_UDT_A" AS
    CONSTRUCTOR FUNCTION ZZ_UDT_A RETURN SELF AS RESULT
    AS BEGIN RETURN; END;
    END;
    /
    Le code de la fonction packagée :
    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
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
     
    CREATE OR REPLACE PACKAGE "PK_TYPE_OPAQUE" IS
    FUNCTION creation_3ieme_type ( p_src1 IN ANYDATA, p_src2 IN ANYDATA, p_dest OUT ANYDATA ,p_mess OUT VARCHAR2 )
    RETURN BOOLEAN
    ;
    END PK_TYPE_OPAQUE;
    /
    CREATE OR REPLACE PACKAGE BODY "PK_TYPE_OPAQUE" IS
    FUNCTION creation_3ieme_type ( p_src1 IN ANYDATA, p_src2 IN ANYDATA, p_dest OUT ANYDATA ,p_mess OUT VARCHAR2 )
    RETURN BOOLEAN
    IS
     
    l_sql           NUMBER;
    w_type_src1     VARCHAR2(30);
    w_type_src2     VARCHAR2(30);
    w_type_dest    VARCHAR2(30);
     
    -- GESTION ELEMENT SOURCE 
    l_anydata ANYDATA;
    l_anytype ANYTYPE;
    l_typeid PLS_INTEGER;
    l_attr_typeid PLS_INTEGER;
     
    -- Eléments d'information sur un attribut
    l_prec PLS_INTEGER;
    l_scale PLS_INTEGER;
    l_len PLS_INTEGER;
    l_csid PLS_INTEGER;
    l_csfrm PLS_INTEGER;
    l_schema_name VARCHAR2(30);
    l_type_name VARCHAR2(30);
    l_version VARCHAR2(30);
    l_count PLS_INTEGER;
    l_attr_elt_type ANYTYPE;
    l_aname VARCHAR2(100);
    l_statement VARCHAR2 (32000);
    l_result_code PLS_INTEGER;
     
    l_number NUMBER;
    l_string VARCHAR2 (4000);
    l_date DATE;
     
    -- GESTION ELEMENT DESTINATION 
    l_anydata2 ANYDATA;
    l_anytype2 ANYTYPE;
    l_typeid2 PLS_INTEGER;
    l_attr_typeid2 PLS_INTEGER;
     
    -- Eléments d'information sur un attribut
    l_prec2 PLS_INTEGER;
    l_scale2 PLS_INTEGER;
    l_len2 PLS_INTEGER;
    l_csid2 PLS_INTEGER;
    l_csfrm2 PLS_INTEGER;
    l_schema_name2 VARCHAR2(30);
    l_type_name2 VARCHAR2(30);
    l_version2 VARCHAR2(30);
    l_count2 PLS_INTEGER;
    l_attr_elt_type2 ANYTYPE;
    l_aname2 VARCHAR2(100);
    l_statement2 VARCHAR2 (32000);
    l_result_code2 PLS_INTEGER;
     
    l_number2 NUMBER;
    l_string2 VARCHAR2 (4000);
    l_date2 DATE;
     
    -- TYPE RESULTANT des 2 premiers 
    l_anydata3 ANYDATA;
     
     
    BEGIN
     
    l_sql := 10;
    p_mess       := NULL;
     
    w_type_src1  := p_src1.GetTypeName;
    w_type_src2  := p_src2.GetTypeName;
     
     
    l_sql := 20;                       
    l_anydata := p_src1;
    l_anydata2:= p_src2;
    -- Obtient le typecode de l_anydata dans l_anytype
    l_typeid := l_anydata.GetType (typ => l_anytype);
    l_typeid2 := l_anydata2.GetType (typ => l_anytype2);
    -- Obtient les informations de type de l_anytype. c'est-à-dire la taille, la précision¿
    l_typeid := l_anytype.GetInfo (
    l_prec, l_scale, l_len, l_csid, l_csfrm,
    l_schema_name, l_type_name, l_version, l_count);
     
    l_typeid2 := l_anytype2.GetInfo (
    l_prec2, l_scale2, l_len2, l_csid2, l_csfrm2,
    l_schema_name2, l_type_name2, l_version2, l_count2);
     
     
    -- Défini le mode d'accès attribut par attribut
    l_anydata.PieceWise;
    l_anydata2.PieceWise;
     
    -- Creation du 3ième TYPE 
    -- Débute la création de la variable l_anydata de type ANYDATA
    -- Le type "spécifique" de l_anydata est l_anytype
    ANYDATA.BeginCreate (
    dtype => l_anytype,
    adata => l_anydata3);
     
    l_anydata3.PieceWise;
     
    l_sql := 80;                       
     
    -- l_count renvoi le nombre d'attributs
    FOR pos IN 1..l_count LOOP
    -- Obtient l'information de type d'un attribut du type
    l_attr_typeid := l_anytype.GetAttrElemInfo (
    pos,
    l_prec, l_scale, l_len, l_csid, l_csfrm,
    l_attr_elt_type, l_aname);
     
    l_attr_typeid2 := l_anytype2.GetAttrElemInfo (
    pos,
    l_prec2, l_scale2, l_len2, l_csid2, l_csfrm2,
    l_attr_elt_type2, l_aname2);
     
    l_number := NULL;
    l_date   := NULL;
    l_string := NULL;
     
    l_number2 := NULL;
    l_date2   := NULL;
    l_string2 := NULL;
     
    -- Obtient la valeur actuelle du type correspondant
    -- et exécute le bloc pour une assignation dynamique de l'enregistrement
     
    l_sql := 200;                       
     
    CASE l_attr_typeid
    WHEN DBMS_TYPES.TYPECODE_NUMBER  THEN
     
    l_result_code := l_anydata.GetNumber (l_number);
    l_result_code2 := l_anydata2.GetNumber (l_number2);
    l_anydata3.SetNumber ( NVL(l_number2,l_number));
     
    WHEN DBMS_TYPES.TYPECODE_VARCHAR2 THEN
     
    l_result_code  := l_anydata.GetVARCHAR2 ( l_string);
    l_result_code2 := l_anydata2.GetVARCHAR2 ( l_string2);
    l_anydata3.SetVARCHAR2 ( NVL(l_string2,l_string));
     
    WHEN DBMS_TYPES.TYPECODE_DATE THEN
     
    l_result_code := l_anydata.GetDate (l_date);
    l_result_code2 := l_anydata2.GetDate (l_date2);
    l_anydata3.SetDate ( NVL(l_date2,l_date));
     
    WHEN 3  THEN -- Normalement s'est une INTEGER 
    -- Comment le recuperer ?????? 
    -- 
       NULL;
        --l_anydata3.SetNumber ( NVL(l_number2,l_number));
     
    ELSE
     
       NULL;
     
    END CASE;
     
     
    l_sql := 300;                       
     
     
    END LOOP;                       
     
     
     
    -- Termine la création de la variable l_anydata
    l_anydata3.EndCreate;                       
     
     
    l_sql := 400;                       
     
    p_dest := l_anydata3;
     
    RETURN TRUE;
     
    EXCEPTION 
    WHEN OTHERS THEN
     
    p_mess := 'ERR ORACLE Inst='||l_sql||' - '||SQLERRM(SQLCODE);
     
    RETURN FALSE;
     
    END creation_3ieme_type;
     
     
     
     
     
    END PK_TYPE_OPAQUE;
    /
    Le script SQL :
    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
     
    set serveroutput on
    spool test_creation_3_type
    DECLARE
    w_mess     VARCHAR2(32000);
    --
    w_type_src1   ANYDATA ;
    w_type_src2   ANYDATA ;
    w_type_dest  ANYDATA ;
    w_result_code PLS_INTEGER;
    -- 
     
    w_zz_a1  ZZ_UDT_A;
    w_zz_a2  ZZ_UDT_A;
    w_zz_a3  ZZ_UDT_A;
     
    BEGIN
    w_zz_a1 := ZZ_UDT_A();
    w_zz_a2 := ZZ_UDT_A();
     
    w_zz_a2.A := 'BC';
    w_zz_a2.I := 100;
     
    w_zz_a1.A := 'BB';
    w_zz_a1.N := 13;
    w_zz_a1.D := SYSDATE;
     
    w_type_src1  := ANYDATA.convertObject(w_zz_a1);
    w_type_src2  := ANYDATA.convertObject(w_zz_a2);
     
    IF NOT pk_type_opaque.creation_3ieme_type ( w_type_src1, w_type_src2, w_type_dest,  w_mess )
    THEN
    DBMS_OUTPUT.PUT_LINE (' APRES ERROR  Mess='||substr(w_mess,1,80) );
    ELSE
    w_result_code := w_type_dest.GetObject (w_zz_a3 );
    DBMS_OUTPUT.PUT_LINE (' RESULTAT OK  dest A['||w_zz_a3.A||'] dest N=['||w_zz_a3.N||'] dest D=['||w_zz_a3.D ||']dest D=['||w_zz_a3.I ||']' );
    END IF;
    END;
    /
     
    spool off

  4. #4
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    octobre 2007
    Messages
    5 535
    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 535
    Points : 11 332
    Points
    11 332

    Par défaut

    Je n'ai pas regardé pour l'instant le code mais si c'est que vous chagrine est le type Integer alors sachez que cela est juste un autre nom pour Number(38,0)
    Dans le package standard
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    subtype INTEGER is NUMBER(38,0)
    Ces types existent chez Oracle pour compatibilité AINSI ou DB2 mais ce sont parfois juste des alias pour les type natives d'Oracle; c'est le cas du type integer.
    Donc en principe nul besoin d'une Set/GetInteger.

Discussions similaires

  1. Manipulation d'un attribut de type QListIterator
    Par mac&cheese dans le forum Qt
    Réponses: 12
    Dernier message: 22/03/2008, 23h54
  2. manipulation d'un champ de type Memo
    Par ivanleterrible dans le forum Bases de données
    Réponses: 6
    Dernier message: 29/05/2006, 21h53
  3. Réponses: 3
    Dernier message: 02/05/2006, 15h12
  4. probleme avec les attributs de type ID
    Par ben83 dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 01/01/2006, 21h49
  5. Réponses: 3
    Dernier message: 20/09/2005, 08h59

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