Przykład projektu GRAVITY z użyciem operatora CALL SQL.
Używając operatora możesz wykonać dowolne komendy DML (Data Manipulation Language) oraz DDL (Data Definition Language) na jakie pozwala konto bazy danych, które używasz do połączenia się z bazą danych. O ile nie użyjesz opcji Single execution zapytanie będzie wykonane dla każdego rekordu znajdującego się na magistrali danych.
W budowie zapytania możesz wykorzystać bity magistrali lub tablicę bitów w formacie JSON (tryb Single execution), parametry projektu, metajęzyk oraz funkcje podmiany tekstu w zapytaniu.
KONFIGURACJA OPERATORA
Operator służy do wykonania kodu SQL w bazie danych, a zatem przede wszystkim musisz wskazać podłączenie do wybranej bazy.
Masz dwa warianty wykorzystania operatora (zakładka STATEMENT).
Wariant pierwszego wyboru, to wariant wywoływania kodu SQL dla każdego rekordu, znajdującego się w strumieniu danych na magistrali wejściowej.
Możesz jednak zdecydować się na wariant jednokrotnego wywołania zapytania dla wszystkich rekordów, należy wówczas zaznaczyć opcję SINGLE EXECUTION.
Kod SQL może zwracać wynik, który jest przetworzony w sposób, w zależny od nastawy TARGET RESULT (patrz ilustracja powyżej):
- VALUE INTO AN EXISTING COLUMN → wynik polecenia SQL będzie umieszczony we wskazanej kolumnie magistrali wyjściowej (pozostałe dane magistrali wejściowej zachowują swoje wartości);
- VALUES FROM FIRST ROW TO THE EXISTING COLUMNS → wartości kolumn zapytania SQL mogą zostać zapisane do już istniejących kolumn magistali. Wybierając ta opcję zobaczysz dodatkową zakładkę Column matching
- CREATE A BUSBAR FROM RESULT → magistrala wyjściowa zostaje zamieniona na wynik działania polecenia SQL.
- ADD TO THE BUSBAR THE DATA FROM THE QUERY → Kolumny pobrane z zapytania SQL zostaną dodane do danych magistali wyjściowej.
- IGNORE RESULT → dane zwrócone poleceniem SQL są ignorowane; na wyjściu magistrali pojawi się strumień danych identyczny jak na magistrali wejściowej;
Dopasuj do kolumny zwracanej z zapytania Column name odpowiedni bit magistali Busbar bit. Możesz dopasaować wiele kolumn do wielu bitów. Jeśli nie widzisz kolumn zwróconych przez zapytanie użyj przycisku Refresh sql columns.
Jeśli zapytanie zwróci więcej niż jeden wiersz tylko dane z pierwszego wiersza zostaną podstawione pod bity magistali
Jeśli zpytanie zwróci więcej niż jeden rekord dla przetwarzanego rekordu magistrali dane magistrali zostaną powielone tylekroć ile rekordów zwróci zapytanie SQL
Pole SEPARATE TRANSACTION pozwala na uruchomienie kodu SQL w oddzielnej transakcji, która zostanie zakończona po wykonaniu zapytania.
BUDOWA ZAPYTANIA SQL
W polu STATEMENT możesz edytować wyrażenie SQL. Dostęp do bitów magistrali wejściowej, parametrów projektu oraz funkcji wbudowanych zapewnia słownik. Całe wyrażenie można przetestować wybierając opcję TEST.
Parametry projektu i bity magistrali doklejane są do zapytania w formie @[nazwa_bitu]
i podlegają parsowaniu w celu wyeliminowania ataku sql injection.
przykład użycia bitu o nazwie “id” w zapytaniu:
select id, name from g.customer where id=@id
Poza możliwością wstawienia bitów magistrali oraz parametrów projektu istnieje możliwość wstawienia wbudowanych funkcji oraz metajęzyka.
- @EXECUTEID → parametr przechowujący unikalny identyfikator przetwarzanego procesu. Możesz go użyć w dowolnym zapytaniu sql.
- @GET_JSON[] → parametr, który zwraca tablicę obiektów JSON złożoną z wszystkich wskazanych bitów magistrali.
- {metalanguage_phrase} → funkcja sprawdzająca warunek:
{[wyrażenie] ? “wyrażenie spełnione” : “wyrażenie niespełnione”}
- {IF_NOT_EMPTY} → buduje frazę metajęzyka sprawdzającą czy wybrany bit ma wartość i nie jest null-em.
- {TO_SQLTEXT} → funkcja dodająca tekst podlegający parsowaniu (zapobieganie atakowi sql injection) w apostrofach
- {TO_PURE_VALUE} → funkcja dodająca tekst bez żadnej ingerencji:
{TO_PURE_VALUE([text doklejany])}
Przykład użycia w zapytaniu
INSERT INTO etl.articles(index, index_name, code, unit, processId) VALUES (@index, @index_name, @code, @unit, @EXECUTEID);
Przykład definicji:
zakładamy, że magistrala wygląda w następujący sposób:
id | name | unit |
1 | name 1 | t |
2 | name 1 | t |
wykonując zapytanie:
select @GET_JSON[@id, @name] as json_data
otrzymamy wartość pola json_data
[{"id": 1,"name":"name 1","unit":"t"},{"id":2,"name":"name 2","unit":"t"}]
Parametr @GET_JSON[] możesz wykorzystać używając trybu SINGLE EXECUTION aby wykonać tylko jedno zapytanie, a zależy Ci na użyciu danych z magistrali.
Wykorzystując funkcję bazy danych możesz przekształcić tablice JSON do formatu danych tabeli danych i wykorzystać w zapytaniu SQL.
Przykład dla bazy PostgreSQL z wykorzystaniem funkcji json_to_recordset
select id, name from json_to_recordset(cast(@GET_JSON[@id, @name] as json)) as x(id int, name text)
pełne wykorzystanie w zapytaniu:
select id, index, index_name, code, unit from etl.articles where id in
(
select id from json_to_recordset(cast(@GET_JSON[@id, @name] as json)) as x(id int, name text)
)
przykładowe użycie w kodzie SQL:
select id, name from g.customer {@id != null && @id != 0 ? " where and id = @id" : ""}
przykładowe użycie w zapytaniu:
select id, name from g.customer {@id != null && @id != 0 ? " where id = @id" : "''"}
przykładowe użycie w zapytaniu:
select id, name, {TO_SQLTEXT(@email)} as email from g.customer
przykładowe użycie w zapytaniu:
select id, name from {TO_PURE_VALUE(@schema)}.customer