Dynamisches SQL in SAP HANA Gespeicherte Prozeduren
Möchte ich eine gespeicherte Prozedur erstellen, in der HANA , die das folgende tut :
- Akzeptiert IN-parameter vom Typ Tabelle.
- Akzeptiert andere parameter von Typ varchar.
- Filter einige Zeilen aus einer bestehenden Tabelle, basierend auf Werte in der Spalte des ersten input-parameter.
- Versucht zu Sortieren (ORDER BY) Zeilen basierend auf den Kriterien, gegeben durch den zweiten Eingabeparameter.
Hier ist die gespeicherte Prozedur, die ich erstellen möchten
CREATE PROCEDURE DEMO_PROD_EXAMPLE_DYNAMIC(IN TEMPLIST PRODLISTTYPE,IN ORDERSTRING VARCHAR(200))
AS
BEGIN
OUTVAR = SELECT * FROM DEMO_PRODS WHERE NAME IN (SELECT NAME FROM :TEMPLIST);
SELECT * FROM :OUTVAR ORDER BY :ORDERSTRING DESC;
END;
Stehe ich vor folgender Hürde :
- In den oben genannten Verfahren, Bestellung geschieht nicht bei allen! Wenn ich fest den Namen der Spalte , wie WÄHLEN Sie * AUS :OUTVAR ORDER BY ID DESC; Es funktioniert .
- Wenn ich versuchen, erstellen Sie eine dynamische SQL-Abfrage wie SELECT * FROM'|| :OUTVAR||' ORDER BY '||:ORDERSTRING||'DESC'; bekomme ich eine exception, dass es nicht erlaubt die Verwendung von varchar und Tabelle geben mit Verkettungsoperator.
Wie kann ich die Sortierung der Ergebnismenge basierend auf einer dynamischen Bedingung (Spalte name/s übergeben-Verfahren) in HANA.
TIA
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden Sie EXECUTE IMMEDIATE zum ausführen einer dynamischen SQL-Anweisung:
Jedoch mit dynamic SQL können Sie nicht verwenden table-Variablen zu wählen. Sie müssen also eine andere Lösung finden für
SELECT * FROM DEMO_PRODS WHERE NAME IN (SELECT NAME FROM :TEMPLIST);
. Mit einem Globale temporäre Tabelle ist eine:Makes the table definition globally available while data is visible only to the current session.
Wenn Sie die Tabelle erstellen, mit der optionON COMMIT DELETE ROWS
, wird es automatisch abgeschnitten, wenn Sie ein commit für die Transaktion. Im Allgemeinen würde ich versuchen zu vermeiden, eine Dynamische SQL-und finde eine andere Lösung. Wenn möglich, verwenden Sie XS und generieren der Abfrage gibt.