Porting di una app Oracle a MySQL

Durante un porting ho incontrato queste differenze che ho dovuto gestire.

Function

Non può contenere istruzioni DDL (es. CREATE TABLE).

Non può nemmeno chiamare una procedura che contene istruzioni DDL.

Se si vogliono lanciare istruzioni DDL, utilizzare le procedure, non le function.

Procedure

Può contenere DDL però mi da’ un fastidioso errore alla dichiarazione di una variabile locale:

DECLARE p_count BIGINT DEFAULT 0;

Viene sollevato un errore che sembra legato alla sintassi:

Errore SQL [1064] [42000]: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 3

ma la sintassi è corretta.

Il problema qui è il client DBeaver: risulta che il driver deve avere una configurazione particolare:

Verifica configurazione della connessione DBeaver

Vai nelle impostazioni della connessione DBeaver:

Modifica la connessione:

Vai su Database > Connessioni > Modifica connessione.

Driver Properties:

Verifica che il driver MySQL utilizzi allowMultiQueries=true:

Se è false, cambia a true (è questo il mio caso)

Aggiungi questa proprietà se non esiste.

Fatta la modifica mi sconnetto e mi riconnetto allo schema e la definizione della procedura con DDL funziona (funziona anche la procedura).

Trigger

I trigger non possono contenere variabili locali, non è ammessa una sezione DECLARE. E’ ammessa solo in procedure e function.

Nei trigger però possono venire usate variabili di sessione, dichiarate con il prefisso @ davanti al nome:

SET @p_username = 'myuser';

Eventualmente spostare il codice che usa variabili locali non di sessione in una procedura e invocare la procedura dal triger.

Ancora Procedure

Nelle procedure però non è consentito l’uso di variabili di sessione, ma solo di variabili locali.

Se ad esempio dichiariamo:

DELIMITER //

CREATE PROCEDURE my_set(p_username VARCHAR(255))
BEGIN
    set @login = p_username;
    -- Restituisce il valore tramite SELECT
    SELECT @login AS result;
END//

DELIMITER ;

incontro un errore che sembra legato alla sintassi:

Errore SQL [1064] [42000]: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 4

Nelle procedure utilizzare solo variabili locali.

In realtà ho trattato in altro modo una variabile di sessione gestendola all’interno di una tabella temporanea, che viene creata dalla procedura alla sua invocazione.

La tabella TEMPORARY così creata non viene listata né da comando

show tables;

né dall’information schema:

SELECT *
FROM information_schema.tables
WHERE table_schema = 'mydb';

per ragioni di consistenza (user diversi vedono cose diverse, e anche lo stesso utente in sessioni diverse).

Però posso interrogarla:

slect count(1)
from app_session;

-- return 1

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.