Pour les requêtes dynamiques, deux paramètres facultatifs permettent de remplacer des conditions dans le fichier DAD : override et overrideType. En fonction des données d'entrée du paramètre overrideType, l'application peut remplacer dans le fichier DAD les valeurs de la balise <SQL_stmt> par le mode de mappage SQL ou les conditions RDB_node par le mode de mappage du noeud RDB.
Ces paramètres sont associés aux valeurs et aux règles suivantes :
.-AND----------------------------------------. V | >>----simple location path--+- =----+---value---+-------------->< +- >----+ +- <----+ +- <>---+ +- >=---+ +- <=---+ '- LIKE-'
Où :
Des espaces facultatifs peuvent figurer avant et après les opérations. Les espaces avant et après l'opérateur LIKE sont obligatoires.
Lorsque XML_OVERRIDE est indiqué, la condition RDB_node de l'élément text_node ou attribute_node correspondant au chemin d'emplacement simple est remplacée par l'expression précisée.
XML_OVERRIDE n'est pas complètement compatible avec XPath. Le chemin d'emplacement simple permet uniquement d'identifier l'élément ou l'attribut mappé vers une colonne.
Exemples :
Les exemples ci-après illustrent le remplacement dynamique à l'aide de SQL_OVERRIDE et XML_OVERRIDE. La plupart des exemples de procédures mémorisées présentés dans ce manuel utilisent NO_OVERRIDE.
Exemple : Procédure mémorisée utilisant SQL_OVERRIDE.
include "dxx.h" include "dxxrc.h" EXEC SQL INCLUDE SQLCA; EXEC SQL BEGIN DECLARE SECTION; char collection[32]; /* dad buffer */ char result_tab[32]; /* name of the result table */ char override[256]; /* override, SQL_stmt */ short overrideType; /* defined in dxx.h */ short max_row; /* maximum number of rows */ short num_row; /* actual number of rows */ long returnCode; /* return error code */ char returnMsg[1024]; /* error message text */ short rtab_ind; short ovtype_ind; short ov_inde; short maxrow_ind; short numrow_ind; short returnCode_ind; short returnMsg_ind; EXEC SQL END DECLARE SECTION; /* create table */ EXEC CREATE TABLE xml_order_tab (xmlorder XMLVarchar); /* initialize host variable and indicators */ strcpy(collection,"sales_ord"); strcpy(result_tab,"xml_order_tab"); sprintf(override,"%s %s %s %s %s %s %s", "SELECT o.order_key, customer, p.part_key, quantity, price,", "tax, ship_id, date, mode ", "FROM order_tab o, part_tab p,", "table(select substr(char(timestamp(generate_unique())),16", "as ship_id,date,mode from ship_tab)as s", "WHERE p.price > 50.00 and s.date >'1998-12-01' AND", "p.order_key = o.order_key and s.part_key = p.part_key"); overrideType = SQL_OVERRIDE; max_row = 500; num_row = 0; returnCode = 0; msg_txt[0] = '\0'; collection_ind = 0; rtab_ind = 0; ov_ind = 0; ovtype_ind = 0; maxrow_ind = 0; numrow_ind = -1; returnCode_ind = -1; returnMsg_ind = -1; /* Call the store procedure */ EXEC SQL CALL dxxRetrieve(:collection:collection_ind; :result_tab:rtab_ind, :overrideType:ovtype_ind,:override:ov_ind, :max_row:maxrow_ind,:num_row:numrow_ind, :returnCode:returnCode_ind,:returnMsg:returnMsg_ind);
Dans cet exemple, l'élément <xcollection> du fichier DAD doit être associé à un élément <SQL_stmt>. Le paramètre override remplace la valeur de l'élément <SQL_stmt>, le nouveau prix devant être supérieur à 50,00 et la nouvelle date postérieure au 1er décembre 1998 (1998-12-01).
Exemple : Procédure mémorisée utilisant XML_OVERRIDE.
include "dxx.h" include "dxxrc.h" EXEC SQL INCLUDE SQLCA; EXEC SQL BEGIN DECLARE SECTION; char collection[32]; /* dad buffer */ char result_tab[32]; /* name of the result table */ char override[256]; /* override, SQL_stmt */ short overrideType; /* defined in dxx.h */ short max_row; /* maximum number of rows */ short num_row; /* actual number of rows */ long returnCode; /* return error code */ char returnMsg[1024]; /* error message text */ short dadbuf_ind; short rtab_ind; short ovtype_ind; short ov_inde; short maxrow_ind; short numrow_ind; short returnCode_ind; short returnMsg_ind; EXEC SQL END DECLARE SECTION; /* create table */ EXEC CREATE TABLE xml_order_tab (xmlorder XMLVarchar); /* initialize host variable and indicators */ strcpy(collection,"sales_ord"); strcpy(result_tab,"xml_order_tab"); sprintf(override,"%s %s", "/Order/Part/Price > 50.00 AND ", "Order/Part/Shipment/ShipDate > '1998-12-01'"); overrideType = XML_OVERRIDE; max_row = 500; num_row = 0; returnCode = 0; msg_txt[0] = '\0'; collection_ind = 0; rtab_ind = 0; ov_ind = 0; ovtype_ind = 0; maxrow_ind = 0; numrow_ind = -1; returnCode_ind = -1; returnMsg_ind = -1; /* Call the store procedure */ EXEC SQL CALL dxxRetrieve(:collection:collection_ind; :result_tab:rtab_ind, :overrideType:ovtype_ind,:override:ov_ind, :max_row:maxrow_ind,:num_row:numrow_ind, :returnCode:returnCode_ind,:returnMsg:returnMsg_ind);
Dans cet exemple, l'élément <collection> du fichier DAD est associé à un noeud RDB pour le noeud d'élément racine. La valeur du paramètre override est basée sur du contenu XML. L'Extension XML substitue la colonne DB2 mappée au chemin d'emplacement simple.