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.

  • 🧩 Definizione di base: Una raccolta di estensioni SQL utilizzate all'interno di stored procedure al posto delle semplici istruzioni SQL.
  • 📦 Due contenitori: Le procedure descrivono una sequenza di trasformazioni; le funzioni definite dall'utente sono disponibili in forma scalare e tabellare.
  • 🧠 Logica dichiarativa: Definisce i tipi di tabella senza fare riferimento alle tabelle del database ed esegue normali istruzioni SELECT.
  • 🎼 Logica di orchestrazione: Implementa il flusso di dati con istruzioni DDL, DML e query, oltre a cicli e condizioni.
  • 🔀 Logica imperativa: I cicli IF, ELSEIF, ELSE, CASE, FOR e la gestione delle eccezioni suddividono la logica tra i flussi di dati.
  • 📤 Uscite multiple: A differenza di una semplice procedura SQL, una procedura SQL Script restituisce diversi risultati tramite parametri OUTPUT.
  • Esecuzione parallela: Le istruzioni indipendenti vengono eseguite in parallelo dal motore di calcolo.

Script SQL in SAP HANA

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.

  1. 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.
  2. 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.
  3. 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.
  4. Dichiarare READS SQL DATA dove vero. Ciò indica che la procedura non presenta effetti collaterali, consentendo un'ulteriore ottimizzazione.
  5. 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.
  6. 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.

DOMANDE FREQUENTI

I due punti indicano la lettura della variabile. Scriverla senza i due punti a sinistra indica un'assegnazione, quindi le due forme permettono al parser di distinguere l'assegnazione dal riferimento.

No. Gli operatori di pianificazione del motore di calcolo sono deprecati. Il codice esistente continua a essere eseguito, ma i nuovi sviluppi dovrebbero utilizzare SQL standard, che l'ottimizzatore ora gestisce almeno altrettanto bene.

Spesso sì. Molti cicli FOR e cursori esprimono un join o un'aggregazione scritti in modo esteso, e l'IA può proporre l'equivalente basato su insiemi. Verifica che il conteggio delle righe corrisponda prima di adottarlo.

Sì. Leggere il pianoViz trace, l'IA identifica l'istruzione che consuma più tempo e se i passaggi sono stati serializzati da una dipendenza non necessaria tra le variabili della tabella.

Sì, tramite diversi parametri della tabella OUTPUT. Questo è uno dei principali vantaggi di SQL Script rispetto a una semplice procedura SQL, che può restituire un solo risultato.

Riassumi questo post con: