SQLScript Grundlagen

Anonyme Blöcke, Prozeduren und Funktionen

(C) Brandeis Consulting.

Logische Container

SQLScript Code kann, im Gegensatz zu einzelnen Standard-SQL Anweisungen, nur in sogenannten Logischen Containern ausgeführt werden. In diesen können Variablen deklariert und der Verarbeitungsablauf gesteuert werden.

Es gibt drei unterschiedliche Logische Container:

  • Anonyme Blöcke
  • Prozeduren
  • Funktionen (In den Geschmacksrichtungen Skalar und Tabelle)
(C) Brandeis Consulting.

SQL vs. SQLScript

(C) Brandeis Consulting.

Anonyme Blöcke

Ein Anonymer Block ist eine SQLScript Anweisung!

  • Anonyme Blöcke bilden einen Rahmen um mehrere SQLScript-Anweisungen
  • Innerhalb eines Anonymen Blocks können beliebige SQLScript-Anweisungen verwendet werden, insbesondere können hier Variablen deklariert und verwendet werden
  • Anonyme Blöcke können direkt in der SQL-Konsole verwendet werden
  • Ein Anonymer Block fängt mit DO BEGIN an und schließt mit END

Beispiel für einen anonymen Block

DO 
BEGIN
   lt_tmp = SELECT id, 
                   title 
              FROM tasks;
   
   SELECT * 
   FROM :lt_tmp;
END;
(C) Brandeis Consulting.

SELECT-Abfragen in Logischen Containern

DO 
BEGIN
   lt_tmp = SELECT id, 
                   title 
              FROM tasks;
   
   SELECT * 
   FROM :lt_tmp;
END;

In dem Beispiel sind zwei SELECT-Abfragen:

  • Die erste Abfrage wird einer Tabellenvariable zugewiesen. Die Variable wird damit deklariert und mit Daten gefüllt.
  • Die zweite Abfrage ist nicht zugewiesen. Damit wird das Ergebnis der Abfrage als ResultSet an den Aufrufer zurückgegeben.

In Prozeduren oder Anonymen Blöcken können mehrere nicht zugewiesene Abfragen vorkommen. Diese werden dann alle zurückgegeben. In Eclipse sind dann ggf. mehrere Tabreiter zu sehen.

(C) Brandeis Consulting.

Funktionen und Prozeduren

Funktionen und Prozeduren werden unter einem Namen ( ≠ anonym ) in der Datenbank gespeichert und können darüber aufgerufen werden.

Sie können jeweils IN-Parameter haben, die beim Aufruf mitgegeben werden.

Stored Procedures

Prozeduren sind echte Unterprogramme. Sie können mehrere Rückgabeparameter haben.

Eine Prozedur darf den Datenbankzustand verändern!

Der Aufruf einer Prozedur erfolgt mit der CALL Anweisung.

User Defined Functions (UDF)

Funktionen sind Ausdrücke! Sie geben also genau einen Wert zurück. Das ist entweder

  • ein skalare Wert oder
  • eine Tabelle

Da der Fokus auf dem Ermitteln des Rückgabewertes liegt, dürfen Funktionen den Datenbankzustand nur lesen.

Eine Funktion entspricht einer ABAP Methode mit RETURNING-Parameter.

>
(C) Brandeis Consulting.

Funktionen und Prozeduren aufrufen

Beim Aufruf der beiden Konstrukte wird der Unterschied gut sichtbar:

Prozeduraufrufe

CALL create_user( 'JBRANDEIS' );

oder

CALL global_end( intab, outtab ); 

Jeder Prozeduraufruf ist eine Anweisung.

Verwendung von Funktionen

SELECT t.id,
       udf_name(t.assignee),
       t.title,
       s.status_text
  FROM udf_tasks_in_status(4)           AS t
  LEFT OUTER JOIN udf_statustexts('EN') AS s
   ON t.status = s.id;

Der Aufruf erfolgt im Rahmen einer anderen Anweisung als Ausdruck. Auf Tabellenfunktionen wird wie auf eine DB-Tabelle oder einen View zugegriffen. Damit entspricht sie einem programmierten View.

(C) Brandeis Consulting.

Verwendung von Parametern beim Aufruf

In der SQL-Konsole

Parameter werden entweder

  • in der richtigen Reihenfolge mitgegeben oder
  • es werden benannte Parameter zugewiesen
--Aufruf der Prozedur mit Parameter per Reihenfolge
CALL get_tasks(5, ?);

--Aufruf der Prozedur mit benannten Parametern
CALL get_tasks( ot_result => ?, iv_max_id => 10);

In einem logischen Container

Das Schlüsselwort CALL ist hier optional:

DO BEGIN
  get_tasks(5, lt_tasks);
  SELECT * FROM :lt_tasks;
END;

Nebenbei sehen wir, dass die Tabellenvariable lt_tasks nicht vorab deklariert wurde. Wie bei einer normalen Zuweisung erfolgt eine Inline Deklaration.

(C) Brandeis Consulting.

Anlegen von Prozeduren und Funktionen

Direkt in der Konsole mit der CREATE {FUNCTION|PROCEDURE}-Anweisungen

Nicht für die Anwendungsentwicklung geeignet.

Über die Applikationsserver XSA oder XS(C) der SAP HANA

Für entsprechende Anwendungen. Die zugehörigen Repository Objekte können auch auf andere Systeme bzw. Container deployt werden.

Als AMDP Objekt vom ABAP Applikationsserver

Die Definition des Datenbankobjekts und die Erfassung des Codes erfolgt in einer ABAP Klasse. Es ist kein Datenbankbenutzer für den Entwickler erforderlich.

(C) Brandeis Consulting.

Anlegen mit der CREATE Anweisung

CREATE [OR REPLACE] PROCEDURE <Prozedurname> 
    [(<Parameterliste>)] 
    [LANGUAGE {SQLSCRIPT|RLANG} ] 
    [SQL SECURITY {DEFINER|INVOKER} ] 
    [DEFAULT SCHEMA Defaultschema] 
    [READS SQL DATA ] 
    [WITH ENCRYPTION] 
AS 
BEGIN [SEQUENTIAL EXECUTION]
   <Quellcode> 
END
CREATE [OR REPLACE] FUNCTION <Funktionsname> 
  [(<IN-Parameterliste>)]
  RETURNS <OUT-Parameterdefinition>
  [LANGUAGE SQLSCRIPT] 
  [SQL SECURITY {DEFINER|INVOKER} ] 
  [DEFAULT SCHEMA Defaultschema] 
  [DETERMINISTIC] 
AS BEGIN 
  <Quellcode> 
END

(C) Brandeis Consulting.

Abschnitte in Blöcken

Die logischen Container enthalten normalerweise Anweisungen. Falls explizit Variablen mit DECLARE deklariert werden sollen, so muss das ganz am Anfang geschehen. Optional kann danach noch Ausnahmebehandlung definiert werden. Die Reihenfolge der Abschnitte ist also immer wie folgt:

  1. Explizite Deklaration von lokalen Variablen mit DECLARE, eher selten notwendig.
  2. Deklaration von Ausnahmebehandlern. Das kommt sehr selten vor und ist in BW-Transformationsroutinen nicht relevant.
  3. Anweisungsliste mit der eigentlichen Verarbeitungslogik. Dieser Abschnitt kommt immer vor.
(C) Brandeis Consulting.