Documentazione di PostgreSQL 9.0 > Programmazione del server > PL/pgSQL - Linguaggio procedurale SQL > Consigli per lo sviluppo in PL/pgSQL
PrecedentePL/pgSQL Under the HoodPorting da PL/SQL di OracleSuccessivo

39.11. Consigli per lo sviluppo in PL/pgSQL

Un buon modo di sviluppare in PL/pgSQL è di usare l'editor di testo di propria scelta per creare le funzioni, e in un'altra finestra, usare psql per caricare e testare quelle funzioni. Se si fa in questa maniera, è una buona idea scrivere la funzione usando CREATE OR REPLACE FUNCTION. In questo modo è possibile ricaricare il file per aggiornare la definizione della funzione. Per esempio:

CREATE OR REPLACE FUNCTION testfunc(integer) RETURNS integer AS $$
          ....
$$ LANGUAGE plpgsql;

Mentre psql è in esecuzione, si può caricare o ricaricare tale definizione di funzione con:

\i filename.sql

e quindi fornire immediatamente comandi SQL per testare la funzione.

Un altro ottimo modo di sviluppare in PL/pgSQL è con uno strumento GUI di accesso al database che facilita lo sviluppo in un linguaggio procedurale. Un esempio di tale strumento è pgAdmin, anche se ne esistono altri. Questi strumenti spesso forniscono caratteristiche utili come l'escape di apici singoli e rendono più facile ricreare e fare il debug delle funzioni.

39.11.1. Handling of Quotation Marks

Il codice di una funzione PL/pgSQL è specificato in CREATE FUNCTION come una stringa. Se si scrive la stringa nel modo ordinario circondato da apici singoli, quindi qualsiasi apice singola dentro il corpo della funzione deve essere raddoppiato; allo stesso modo le barre inverse devono essere raddoppiate (assumendo che sia usata la sintassi escape stringa). Raddoppiare gli apici è tedioso, e nei casi più complicati il codice può diventare assolutamente incomprensibile, perchè è facile che si necessiti di mezza dozzina o più apici adiacenti. Si raccomanda di scrivere il corpo della funzione come una stringa «quotata con dollari» (si veda Sezione 4.1.2.4, «Costanti stringa quotate da dollari»). Nell'approccio 'dollar-quoting', non si raddoppia mai nessun apice, fare attenzione a scegliere un delimitatore di quotazione con dollari diverso per ogni livello di annidemento che si necessita. Per esempio, si potrebbe scrivere il comando CREATE FUNCTION come:

CREATE OR REPLACE FUNCTION testfunc(integer) RETURNS integer AS $PROC$
          ....
$PROC$ LANGUAGE plpgsql;

All'interno di questo, si potrebbero usare le virgolette per semplici stringhe letterali in comandi SQL e $$ per delimitare frammenti di comandi SQL che si assemblano come stringhe. Se si necessita quotare testo che include $$, si può usare $Q$, e così via.

Il seguente grafico mosta cosa si deve fare quando si scrivono virgolette senza la quotazione con dollari. Potrebbe essere utile quando si traduce codice pre-quotazione con dollari in qualcosa di più comprensibile.

1 virgoletta

To begin and end the function body, for example:

CREATE FUNCTION foo() RETURNS integer AS '
          ....
' LANGUAGE plpgsql;

Ovunque all'interno del corpo di una funzione tra singoli apici, le virgolette devono apparire in coppia.

2 virgolette

Per letterali stringa all'interno del corspo della funzione, per esempio:

a_output := ''Blah'';
SELECT * FROM users WHERE f_name=''foobar'';

In the dollar-quoting approach, you'd just write:

a_output := 'Blah';
SELECT * FROM users WHERE f_name='foobar';

che è esattamente quello che vedrebbe il parser PL/pgSQL in ogni caso.

4 virgolette

Quando si necessita di una virgoletta singola in una costante stringa all'interno del corpo della funzione, per esempio:

a_output := a_output || '' AND name LIKE ''''foobar'''' AND xyz''

Il valore effettivamente aggiunto a a_output sarebbe: AND name LIKE 'foobar' AND xyz.

Nell'approccio di quotazione con dollari, si scriverebbe:

a_output := a_output || $$ AND name LIKE 'foobar' AND xyz$$

facendo attenzione che ogni delimitatore di quotazione con dollari intorno a questo non sia solo $$.

6 virgolette

Quando una virgoletta singola in una stringa all'interno del corpo della funzione è adiacente alla fine di quella costante stringa, per esempio:

a_output := a_output || '' AND name LIKE ''''foobar''''''

Il valore aggiunto a a_output quindi sarebbe: AND name LIKE 'foobar'.

Nell'approccio di quotazione con dollari, questo diventa:

a_output := a_output || $$ AND name LIKE 'foobar'$$

10 virgolette

When you want two single quotation marks in a string constant (which accounts for 8 quotation marks) and this is adjacent to the end of that string constant (2 more). You will probably only need that if you are writing a function that generates other functions, as in Esempio 39.7, «Portare una funzione che crea un'altra funzione da PL/SQL a PL/pgSQL». Per esempio:

a_output := a_output || '' if v_'' ||
    referrer_keys.kind || '' like ''''''''''
    || referrer_keys.key_string || ''''''''''
    then return ''''''  || referrer_keys.referrer_type
    || ''''''; end if;'';

Il valore di a_output quindi sarebbe:

if v_... like ''...'' then return ''...''; end if;

Nell'approccio di quotazione con dollari, questo diventa:

a_output := a_output || $$ if v_$$ || referrer_keys.kind || $$ like '$$
    || referrer_keys.key_string || $$'
    then return '$$  || referrer_keys.referrer_type
    || $$'; end if;$$;

dove si assume che si abbia bisogno solo di mettere virgolette singole in a_output, dato che sarà riquotato prima dell'uso.

Documentazione di PostgreSQL 9.0 > Programmazione del server > PL/pgSQL - Linguaggio procedurale SQL > Consigli per lo sviluppo in PL/pgSQL
PrecedentePL/pgSQL Under the HoodPorting da PL/SQL di OracleSuccessivo