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;
/ |
Partager