SAP Tutorial sugli script SQL di HANA: sintassi ed esempi
⚡ Riepilogo intelligente
Script SQL in SAP HANA estende lo standard SQL con costrutti funzionali e procedurali. Consente di utilizzare stored procedure e funzioni definite dall'utente, spostando la logica ad alta intensità di dati dal server applicativo al database.

Cos'è lo script SQL?
SQL Script è una raccolta di estensioni di SQL. Può essere utilizzato nella procedura memorizzata al posto del semplice SQL. Ne determina le estensioni funzionali e procedurali.
In SQL L'utente dello script può definire variabili locali per la struttura e le tabelle utilizzate principalmente per la creazione di procedure memorizzate.
Lo script SQL può essere utilizzato anche nella vista Calcolo. In SQL Script, ci sono due diversi contenitori logici:
- Procedura (Le procedure consentono di descrivere una sequenza di trasformazioni di dati sui dati passati come tabelle di input e di database).
- Funzione definita dall'utente (il contenitore Funzione definita dall'utente è separato in Funzione scalare definita dall'utente e Funzione definita dall'utente tabella).
Gli elementi del linguaggio SQL Script Language sono i seguenti:
Logica di script SQL dichiarativa (estensione funzionale)
- Consente la definizione di tipi di tabelle senza fare riferimento alle tabelle del database.
- Istruzione tipica come SELECT.
- Funzioni del motore di calcolo (CE).
⚠️ Nota sulla versione: Gli operatori del piano del motore di calcolo, le funzioni CE_ come CE_COLUMN_TABLE e CE_JOIN, sono deprecati da SAPI nuovi sviluppi dovrebbero utilizzare istruzioni SQL standard, che l'ottimizzatore gestisce almeno altrettanto bene. Il codice CE esistente continua a funzionare, ma dovrebbe essere migrato alla prossima modifica di una procedura.
Logica dello script SQL di orchestrazione (estensione funzionale)
La logica di orchestrazione viene utilizzata per implementare il flusso di dati utilizzando istruzioni di query DDL, DML e SQL e controllare la logica del flusso utilizzando costrutti linguistici imperativi come loop e condizionali.
- Dichiarazione sul linguaggio di definizione dei dati. Ad esempio, crea schema.
- Linguaggio di manipolazione dei dati (ad esempio Inserisci).
Logica dello script SQL imperativo (estensione procedurale)
La logica imperativa suddivide la logica tra diversi flussi di dati. Ad esempio IF, ELSEIF, ELSE, CASE, FOR (Loop) ed Eccezioni.
Importanza dello script SQL
Solo SQL Script fornisce gli elementi necessari per migrare la logica ad alto utilizzo di dati o il funzionamento del server delle applicazioni sul server del database.
Punti chiave di SQL Script
- Lo script SQL viene eseguito ed elaborato nel motore di calcolo all'interno del database HANA.
- SQL Script è in grado di eseguire calcoli complessi.
- In SQL Script è possibile dichiarare una variabile locale per contenere il risultato provvisorio.
- La procedura di script SQL può restituire più risultati utilizzando il "parametro OUTPUT" mentre la procedura SQL normale può restituirne solo uno.
- In SQL Script è possibile definire tipi di tabelle globali o locali che possono essere utilizzati come parametri.
Utilizzando SQL Script è possibile ottenere la modalità di elaborazione parallela.
Esempio di procedura di script SQL
Una procedura è il contenitore più comune. L'esempio seguente legge i dati dei dipendenti, li filtra e restituisce il risultato tramite un parametro di tabella di output.
CREATE PROCEDURE DHK_SCHEMA.GET_HIGH_EARNERS ( IN im_min_salary DECIMAL(15,2), OUT ex_employees TABLE (EMP_NAME NVARCHAR(100), SALARY DECIMAL(15,2)), OUT ex_row_count INTEGER ) LANGUAGE SQLSCRIPT READS SQL DATA AS BEGIN -- Declarative logic: a table variable, not a physical table lt_all = SELECT EMP_NAME, SALARY FROM DHK_SCHEMA.EMPLOYEE WHERE SALARY >= :im_min_salary; -- Imperative logic: branch on the result SELECT COUNT(*) INTO ex_row_count FROM :lt_all; IF :ex_row_count = 0 THEN ex_employees = SELECT '' AS EMP_NAME, 0 AS SALARY FROM DUMMY WHERE 1 = 0; ELSE ex_employees = SELECT * FROM :lt_all ORDER BY SALARY DESC; END IF; END;
Tre convenzioni meritano di essere notate. I due punti precedono qualsiasi lettura di una variabile, quindi :lt_all legge la variabile della tabella mentre lt_all a sinistra viene assegnato. READS SQL DATA indica all'ottimizzatore che la procedura non ha effetti collaterali, il che consente una parallelizzazione più aggressiva. E una procedura che restituisce diversi parametri di output è esattamente la funzionalità di cui il semplice SQL è sprovvisto.
Chiamarlo è semplice:
CALL DHK_SCHEMA.GET_HIGH_EARNERS (50000, ?, ?);
Funzioni scalari e di tabella definite dall'utente
Mentre una procedura esegue delle azioni, una funzione restituisce un valore e può essere utilizzata all'interno di una query. SQL Script offre due forme, che non sono intercambiabili.
| Parametro | UDF scalare | Tabella UDF |
|---|---|---|
| Resi | Un singolo valore | Un insieme di risultati |
| Usato in | SELECT elenco, clausola WHERE, espressioni | La clausola FROM, come una tabella |
| È possibile modificare i dati | Non | Non |
| Utilizzo tipico | Calcolo riutilizzabile come un'aliquota fiscale | Vista parametrizzata che restituisce righe filtrate |
-- Scalar function: returns one value CREATE FUNCTION DHK_SCHEMA.ADD_BONUS (im_salary DECIMAL(15,2)) RETURNS total DECIMAL(15,2) LANGUAGE SQLSCRIPT AS BEGIN total := :im_salary * 1.10; END; SELECT EMP_NAME, DHK_SCHEMA.ADD_BONUS(SALARY) AS WITH_BONUS FROM DHK_SCHEMA.EMPLOYEE;
Una funzione di tabella è definita con RETURNS TABLE e viene quindi interrogata nella clausola FROM, il che la rende il modo naturale per costruire un set di dati parametrizzato riutilizzabile che un vista di calcolo o il rapporto può consumare.
SQL Script migliori pratiche
SQL Script offre prestazioni ottimali se scritto in modo da consentire al motore di parallelizzare le operazioni, e prestazioni scadenti se scritto come codice applicativo. Sei abitudini fanno la differenza.
- Preferire la forma dichiarativa a quella imperativa. Una singola istruzione basata su insiemi offre prestazioni di gran lunga superiori rispetto a un ciclo che elabora le righe una alla volta. Ricorrete a un ciclo FOR solo quando la logica non può essere espressa come un'operazione su insiemi.
- Evitare i cursori. Impongono l'elaborazione riga per riga e neutralizzano completamente il motore di calcolo. Quasi ogni cursore può essere riscritto come un join o un'aggregazione.
- Le dichiarazioni devono essere indipendenti. Vengono calcolate in parallelo due variabili di tabella che non fanno riferimento l'una all'altra. L'esecuzione seriale dell'intera procedura avviene concatenando ogni passaggio attraverso quello precedente.
- Dichiarare READS SQL DATA dove vero. Ciò indica che la procedura non presenta effetti collaterali, consentendo un'ulteriore ottimizzazione.
- Filtrare il prima possibile. Ridurre il numero di righe nella prima variabile della tabella riduce le dimensioni di tutto il flusso successivo, mentre il filtraggio alla fine ha già compensato il costo.
- Migrare dalle funzioni CE_. Sono deprecati, non possono essere combinati liberamente con SQL in un'unica istruzione e l'ottimizzatore SQL ora gestisce lo stesso lavoro in modo migliore.
La sintassi a livello di istruzione è trattata in SAP HANASQL, le funzioni disponibili all'interno di una procedura in SAP Funzioni SQL di HANAe gli oggetti di modellazione che consumano queste procedure nel SAP Modellazione HANA tutorial.
