Für dynamische Abfragen können Sie zwei wahlfreie Parameter zum Überschreiben der Bedingungen in der DAD-Datei verwenden: override und overrideType. Entsprechend der Eingabe von overrideType kann die Anwendung die Befehlswerte <SQL_stmt> für die SQL-Zuordnung überschreiben oder die Bedingungen in RDB_nodes für die RDB_node-Zuordnung in der DAD-Datei.
Diese Parameter haben folgende Werte und Regeln:
.-AND-----------------------------------------. V | >>----einfacher Standortpfad--+- =----+---wert---+------------->< +- >----+ +- <----+ +- <>---+ +- >=---+ +- <=---+ '- LIKE-'
Hierbei gilt folgendes:
Sie können um die Operationen herum Leerzeichen eingeben; um den Operator LIKE sind Leerzeichen erforderlich.
Bei Angabe des Werts XML_OVERRIDE wird die Bedingung für den RDB_node im text_node oder attribute_node, die dem einfachen Standortpfad entspricht, von dem angegebenen Ausdruck überschrieben.
XML_OVERRIDE ist nicht vollständig XPath-kompatibel. Der einfache Standortpfad wird nur zum Kennzeichnen des Elements oder Attributs, das einer Spalte zugeordnet ist, verwendet.
Beispiele:
Die folgenden Beispiele zeigen ein dynamisches Überschreiben mit SQL_OVERRIDE und XML_OVERRIDE. Die meisten gespeicherten Prozeduren in diesem Handbuch verwenden NO_OVERRIDE.
Beispiel: Eine gespeicherte Prozedur, die SQL_OVERRIDE verwendet.
include "dxx.h" include "dxxrc.h" EXEC SQL INCLUDE SQLCA; EXEC SQL BEGIN DECLARE SECTION; char collection[32]; /* DAD-Puffer */ char result_tab[32]; /* Name der Ergebnistabelle */ char override[256]; /* überschreiben, SQL_stmt */ short overrideType; /* definiert in dxx.h */ short max_row; /* maximale Anzahl Zeilen */ short num_row; /* tatsächliche Anzahl Zeilen */ long returnCode; /* Rückkehr-Fehlercode */ char returnMsg[1024]; /* Fehlernachrichtentext */ 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; /* Tabelle erstellen */ EXEC CREATE TABLE xml_order_tab (xmlorder XMLVarchar); /* Host-Variable und Anzeiger initialisieren */ 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; /* Gespeicherte Prozedur aufrufen */ 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);
In diesem Beispiel muß das Element <xcollection> in der DAD-Datei ein Element <SQL_stmt> enthalten. Der Parameter override überschreibt den Wert von <SQL_stmt> durch Ändern des Preises auf einen Wert größer als 50.00, und das Datum wird auf Wert größer als 1998-12-01 geändert.
Beispiel: Eine gespeicherte Prozedur, die XML_OVERRIDE verwendet.
include "dxx.h" include "dxxrc.h" EXEC SQL INCLUDE SQLCA; EXEC SQL BEGIN DECLARE SECTION; char collection[32]; /* DAD-Puffer */ char result_tab[32]; /* Name der Ergebnistabelle */ char override[256]; /* überschreiben, SQL_stmt */ short overrideType; /* definiert in dxx.h */ short max_row; /* maximale Anzahl Zeilen */ short num_row; /* tatsächliche Anzahl Zeilen */ long returnCode; /* Rückkehr-Fehlercode */ char returnMsg[1024]; /* Fehlernachrichtentext */ 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; /* Tabelle erstellen */ EXEC CREATE TABLE xml_order_tab (xmlorder XMLVarchar); /* Host-Variable und Anzeiger initialisieren */ 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; /* Gespeicherte Prozedur aufrufen */ 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);
In diesem Beispiel hat das Element <collection> in der DAD-Datei einen RDB_node für den Root-element_node. Der Wert für override hängt vom XML-Wert ab. Der XML Extender wandelt den einfachen Standortpfad um in die zugeordnete DB2-Spalte um.