Operator CALL SQL umożliwia wykonywanie dowolnych zapytań SQL na wskazanej bazie danych, przy wykorzystaniu danych dostępnych na magistrali wejściowej, a także parametrów projektowych i globalnych.
W zależności od konfiguracji operator może wykonywać:
- komendy DML (np.
SELECT
,INSERT
,UPDATE
,DELETE
) – do manipulacji danymi, - komendy DDL (np.
CREATE
,ALTER
,DROP
) – do zarządzania strukturą bazy danych.
Domyślnie zapytanie SQL jest wykonywane dla każdego rekordu na magistrali wejściowej. Istnieje jednak możliwość skorzystania z trybu Single execution, dzięki któremu zapytanie zostanie wykonane tylko raz – niezależnie od liczby rekordów.
W budowie zapytania możesz użyć:
- bitów magistrali danych (indywidualnych lub tablicy bitów w formacie JSON w trybie Single execution),
- parametrów projektu
- zmiennych globalnych
- metajęzyka GRAVITY
- funkcji podmiany tekstu, umożliwiających dynamiczną modyfikację treści zapytania na podstawie przetwarzanych danych.
Dzięki elastycznej składni oraz możliwości powiązania zapytań z danymi wejściowymi, operator CALL SQL doskonale sprawdza się w integracji z bazami danych, m.in. przy:
- pobieraniu i uzupełnianiu danych pomocniczych,
- zapisywaniu wyników przetwarzania,
- realizacji logiki biznesowej bezpośrednio w bazie danych.
Przykład projektu GRAVITY z użyciem operatora CALL SQL.
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.
Jeśli w trybie Single execution chcesz użyć wartości danych z magistrali jest to możliwe korzystając z funkcji @GET_JSON[]
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