Oracle PL/SQL: porting della funzione SPLIT_PART da PostgreSQL a Oracle



Recentemente mi è capitato effettuare il porting di una serie di funzioni da PL/pgSQL  a PL/SQL. Durante questo lavoro ho avuto modo di valutare i pregi di entrambi i linguaggi, e scoprire le molte analogie e le sottili ma importanti differenze.

Una delle caratteristiche di PostgreSQL che non hanno una corrispondenza in Oracle è la presenza della funzione SPLIT_PART, di cui riporto la signature:

split_part(string text, delimiter text, field int)

Il suo comportamento è tanto semplice quanto utile: la funzione effettua lo split della stringa “string” ad ogni occorrenza del token “delimiter”, e restituisce la sottostringa che si trova nella posizione identificata dal numero “field”.

Ad esempio, in PostgreSQL la chiamata

select split_part('uno;due;tre' , ';' , 3)
 

restituirebbe la stringa ‘tre’.

La soluzione adottata per far fronte a questa mancanza è stata quella di riscrivere la SPLIT_PART ex novo in PL/SQL, sfruttando le funzioni REGEXP_INSTR e SUBSTR di Oracle.

CREATE OR REPLACE FUNCTION SPLIT_PART(
  p_string VARCHAR2,
  p_delimiter VARCHAR2,
  p_field NUMBER
) RETURN VARCHAR2
AS
  v_start  NUMBER;
  v_length NUMBER;
  v_end  NUMBER;
BEGIN

  --1) calcolo della posizione del carattere di start
  IF p_field = 1 THEN
    v_start := 1;
  ELSE
    v_start := REGEXP_INSTR(p_string, p_delimiter, 1, p_field -1)+1;
    IF v_start = 1 THEN
      RETURN NULL;
    END IF;
    v_start := v_start+LENGTH(p_delimiter)-1;
  END IF;




  -- 2) calcolo della posizione del carattere di end
  v_end   := REGEXP_INSTR(p_string, p_delimiter, 1, p_field)-1;
  IF v_end = -1 THEN
    v_end := LENGTH(p_string);
  END IF;

  -- 3) estrazione della sottostringa
  RETURN SUBSTR(p_string, v_start, v_end-v_start+1);

EXCEPTION
  WHEN OTHERS THEN
    RETURN NULL;
END;

Il codice è molto semplice, e fondamentalmente si divide in tre blocchi procedurali.

Nel primo blocco viene calcolata la posizione del carattere a partire dal quale estrarre la sottostringa. Nel secondo blocco viene calcolata la posizione del carattere fino al quale estrarre la sottostringa. Il terzo blocco è costituito da una unica riga che fa uso della funzione SUBSTR per restituire la sottostringa desiderata.

A conclusione, vediamo due esempi di utilizzo della funzione SPLIT_PART in Oracle:

SQL> SELECT SPLIT_PART('abc~@~def~@~ghi', '~@~', 2) AS RES
2  FROM DUAL;

RES
----------------------------------------------------------
def


SQL> SELECT SPLIT_PART('abc~@~def~@~ghi', '~@~', 4) AS RES
2  FROM DUAL;


RES
----------------------------------------------------------


Come si può notare nel secondo esempio, la richiesta di una sottostringa inesistente avrà come unico risultato null.

Annunci sponsorizzati:
Condividi su Facebook Condividi su Twitter!
Pinterest