Interne Tabellen (SQLScript): Unterschied zwischen den Versionen
Matt (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
Matt (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
||
(7 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
Zeile 5: | Zeile 5: | ||
https://github.com/SAP-samples/hana-xsa-opensap-hana7/blob/master/db/src/procedures/build_products.hdbprocedure | https://github.com/SAP-samples/hana-xsa-opensap-hana7/blob/master/db/src/procedures/build_products.hdbprocedure | ||
== | == Variablendeklaration == | ||
Interne Tabellen können mit <code>TABLE</code> | === Interne Tabellen deklarieren === | ||
Interne Tabellen können mit <code>TABLE</code> in der signatur einer Procedure definiert werden: | |||
<syntaxhighlight lang="sql"> | <syntaxhighlight lang="sql"> | ||
Zeile 21: | Zeile 23: | ||
BEGIN | BEGIN | ||
... | |||
END | |||
</syntaxhighlight> | |||
Definition einer internen Tabelle mit <code>DECLARE TABLE LIKE</code>: | |||
<syntaxhighlight lang="sql"> | |||
declare lt_products table like :ex_products; | declare lt_products table like :ex_products; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
=== Variablen und Arrays deklarieren === | |||
Definition von Variablen mit Vorgabewert, Arrays, etc. mit <code>DECLARE</code>: | |||
<syntaxhighlight lang="sql"> | |||
declare lv_index int = 0; | |||
declare lv_del_index int array; | |||
declare lv_array_index int = 0; | |||
</syntaxhighlight> | |||
== SELECT from DB == | == SELECT from DB == | ||
Zeile 42: | Zeile 63: | ||
Einfügen von Datensätzen mit Angabe des Datensatzes und eines Indexes | Einfügen von Datensätzen mit Angabe des Datensatzes und eines Indexes: | ||
<syntaxhighlight lang="sql"> | <syntaxhighlight lang="sql"> | ||
Zeile 49: | Zeile 70: | ||
:ex_products.INSERT(('ProductC','Software','3999.99'),3); | :ex_products.INSERT(('ProductC','Software','3999.99'),3); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Datensätze an bestehender Stelle werden nach unten geschoben. Wenn eine Indexposition gewählt wird, die sich mehr, als eins nach dem letzten bestehenden Datensatz befindet, werden die Index-Positionen zwischen den bestehenden und den neuen Datensätzen mit leeren Datensätzen aufgefüllt. | |||
== UPDATE == | == UPDATE == | ||
<syntaxhighlight lang="sql"> | |||
FOR lv_index IN 1..record_count(:ex_products) DO | |||
:ex_products.(PRICE).UPDATE((:ex_products.PRICE[lv_index] * 1.25),lv_index); | |||
END FOR; | |||
</syntaxhighlight> | |||
== DELETE == | == DELETE == | ||
Beispiel, um aus einer internen Tabelle Datensätze mit bestimmten Kriterien rauszusuchen, deren Index in einem Array zu speichern, und dann alle DAtensätze mit den gesammelten Indizes zu löschen: | |||
<syntaxhighlight lang="sql"> | |||
FOR lv_index IN 1..record_count(:ex_products) DO | |||
IF :ex_products.PRICE[lv_index] <= 2500.00 THEN | |||
lv_array_index = lv_array_index + 1; | |||
lv_del_index[lv_array_index] = lv_index; | |||
END IF; | |||
END FOR; | |||
:ex_products.DELETE(:lv_del_index); | |||
</syntaxhighlight> | |||
== SEARCH == | == SEARCH == | ||
== | <syntaxhighlight lang="sql"> | ||
lv_index = :ex_products.SEARCH("CATEGORY",'PC',1); | |||
ex_pc_productid = :ex_products.PRODUCTID[lv_index]; | |||
</syntaxhighlight> | |||
== Kontrollstrukturen == | |||
=== IF-Abfrage === | |||
IF-Abfrage der Spalte PRICE auf einen bestimmten Wert. Dabei gehört <code>lv_index</code> zu einem übergeorneten Loop (siehe Delete): | |||
<syntaxhighlight lang="sql"> | |||
IF :ex_products.PRICE[lv_index] <= 2500.00 THEN | |||
lv_array_index = lv_array_index + 1; | |||
lv_del_index[lv_array_index] = lv_index; | |||
END IF; | |||
</syntaxhighlight> | |||
=== FOR-Loop === | |||
<syntaxhighlight lang="sql"> | |||
FOR lv_index IN 1..record_count(:ex_products) DO | |||
... | |||
END FOR; | |||
</syntaxhighlight> | |||
== Referenz == | == Referenz == | ||
Zeile 69: | Zeile 131: | ||
[[Category: | [[Category:SAP]] | ||
[[ | [[Kategorie:SQL]] |
Aktuelle Version vom 16. März 2024, 12:38 Uhr
Ähnlich zu ABAP kann man in SQLScript ebenfalls mit internen Tabellen arbeiten. Nachfolgend sind unterschiedliche Nutzungsbeispiele aufgeführt.
Eine Implementierung der untenstehenden Beispiele in Form einer Stored Procedure findet sich hier: https://github.com/mattxdev/openSAPHANA/blob/master/db/src/procedures/build_products.hdbprocedure https://github.com/SAP-samples/hana-xsa-opensap-hana7/blob/master/db/src/procedures/build_products.hdbprocedure
Variablendeklaration
Interne Tabellen deklarieren
Interne Tabellen können mit TABLE
in der signatur einer Procedure definiert werden:
PROCEDURE "build_products"(
OUT ex_products TABLE(
PRODUCTID NVARCHAR(10),
CATEGORY NVARCHAR(20),
PRICE DECIMAL(15,2) ) )
LANGUAGE SQLSCRIPT
SQL SECURITY INVOKER
--DEFAULT SCHEMA <default_schema_name>
READS SQL DATA AS
BEGIN
...
END
Definition einer internen Tabelle mit DECLARE TABLE LIKE
:
declare lt_products table like :ex_products;
Variablen und Arrays deklarieren
Definition von Variablen mit Vorgabewert, Arrays, etc. mit DECLARE
:
declare lv_index int = 0;
declare lv_del_index int array;
declare lv_array_index int = 0;
SELECT from DB
Befüllung der internen Tabelle per SELECT-Statement:
lt_products = SELECT PRODUCTID, CATEGORY, PRICE from "MD.Products";
INSERT
Beispiele für Befüllung von internen Tabellen, z.B. Zuweisung mit dem Inhalt einer anderen internen Tabelle:
:ex_products.INSERT(:lt_products);
Einfügen von Datensätzen mit Angabe des Datensatzes und eines Indexes:
:ex_products.INSERT(('ProductA','Software','1999.99'),1);
:ex_products.INSERT(('ProductB','Software','2999.99'),2);
:ex_products.INSERT(('ProductC','Software','3999.99'),3);
Datensätze an bestehender Stelle werden nach unten geschoben. Wenn eine Indexposition gewählt wird, die sich mehr, als eins nach dem letzten bestehenden Datensatz befindet, werden die Index-Positionen zwischen den bestehenden und den neuen Datensätzen mit leeren Datensätzen aufgefüllt.
UPDATE
FOR lv_index IN 1..record_count(:ex_products) DO
:ex_products.(PRICE).UPDATE((:ex_products.PRICE[lv_index] * 1.25),lv_index);
END FOR;
DELETE
Beispiel, um aus einer internen Tabelle Datensätze mit bestimmten Kriterien rauszusuchen, deren Index in einem Array zu speichern, und dann alle DAtensätze mit den gesammelten Indizes zu löschen:
FOR lv_index IN 1..record_count(:ex_products) DO
IF :ex_products.PRICE[lv_index] <= 2500.00 THEN
lv_array_index = lv_array_index + 1;
lv_del_index[lv_array_index] = lv_index;
END IF;
END FOR;
:ex_products.DELETE(:lv_del_index);
SEARCH
lv_index = :ex_products.SEARCH("CATEGORY",'PC',1);
ex_pc_productid = :ex_products.PRODUCTID[lv_index];
Kontrollstrukturen
IF-Abfrage
IF-Abfrage der Spalte PRICE auf einen bestimmten Wert. Dabei gehört lv_index
zu einem übergeorneten Loop (siehe Delete):
IF :ex_products.PRICE[lv_index] <= 2500.00 THEN
lv_array_index = lv_array_index + 1;
lv_del_index[lv_array_index] = lv_index;
END IF;
FOR-Loop
FOR lv_index IN 1..record_count(:ex_products) DO
...
END FOR;
Referenz
SAP HANA SQLScript Reference for SAP HANA Platform 2.0 SPS04 v1.1 2019-10-31: https://help.sap.com/doc/6254b3bb439c4f409a979dc407b49c9b/2.0.04/en-US/SAP_HANA_SQL_Script_Reference_en.pdf