Funzioni di chiamata con exec invece di selezionare

Predefinito è il modo di chiamare una funzione select * from my_function()?

Chiedo perché ho creato una funzione che non restituisce nulla, solo che inserisce i dati in una tabella e (provenienti da un database di SQL Server in background) si “sente” strano chiamarlo con select * from...

Mi aspettavo qualcosa di simile exec my_function()

InformationsquelleAutor Diego | 2013-08-19



3 Replies
  1. 45

    utilizzare PERFORM istruzione – http://www.postgresql.org/docs/current/static/plpgsql-statements.html

    A volte è utile per valutare un’espressione o di una query di selezione, ma
    scartare il risultato, per esempio, quando si chiama una funzione che ha
    effetti collaterali, ma nessun risultato utile di valore. Per fare questo in PL/pgSQL, utilizzare
    ESEGUIRE l’istruzione

    quindi è solo

    DO $$ BEGIN
        PERFORM my_function();
    END $$;
    • PERFORM è valido solo all’interno di PL/PgSQL. Non è possibile utilizzare stand-alone.
    • sì, dovrebbe essere eseguita all’interno di PL/PgSQL blocco o in funzione, aggiornati
  2. 36

    PostgreSQL 11:

    PostgreSQL 11 supporta true stored procedure come sottolineato da @AbdisamadKhalif . Essi sostengono in-procedura di controllo delle transazioni.

    Versioni precedenti:

    Sì, questo è il modo standard, e sì, è strano.

    Di solito si scriverebbe funzioni quali stored procedure e richiamarli con il CALL o EXECUTE comando. PostgreSQL non supporta vero stored procedure (più set di risultati, autonoma transazioni, e tutto ciò che), però, solo sql-callable funzioni definite dall’utente.

    Quindi la soluzione è SELECT function_name() utilizzo di PostgreSQL con estensione sintassi che omette FROM, o SELECT 1 FROM function_name(); di essere (un po’) più standard.

    Il driver ODBC, JDBC driver, etc capire il {call func_name()} fuga sintassi e tradurlo automaticamente ad un sottostante di SELECT.

  3. 22

    Utilizzare from quando la funzione restituisce un set. Se la funzione restituisce void basta fare

    select my_function();

Lascia un commento