Interne Tabellen (SQLScript)

Aus MattWiki
Version vom 16. März 2024, 13:38 Uhr von Matt (Diskussion | Beiträge)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)

Ä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