sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur använder man `RETURN NEXT`i PL/pgSQL korrekt?

Exemplet som ges kan helt ersättas med RETURN QUERY :

BEGIN
    RETURN QUERY SELECT y_.y, 'hi' FROM generate_series(1,10,1) AS y_(y)
END;

vilket kommer att bli en mängd snabbare.

Generellt bör du undvika iteration där det är möjligt, och istället föredrar set-orienterade operationer.

Där return next över en slinga är oundvikligt (vilket är mycket sällsynt och oftast begränsat till när du behöver hantering av undantag) måste du ställa in OUT parametervärden eller tabellparametrar, return next utan argument.

I det här fallet är ditt problem raden SELECT yr.y, 'hi'; som inte gör någonting. Du antar att den implicita destinationen för en SELECT är ut-parametrarna, men så är inte fallet. Du måste använda ut-parametrarna som loopvariabler som @peterm gjorde, använda tilldelningar eller använda SELECT INTO :

FOR yr IN SELECT * FROM generate_series(1,10,1) AS y_(y) 
LOOP
    RAISE NOTICE 'Computing %', yr.y;
    y := yr.y;
    result := 'hi';
    RETURN NEXT;
END LOOP;
RETURN;


  1. SQL Server INFORMATION_SCHEMA Visningar | Se om det finns en tabell

  2. Hur ATAN2() fungerar i MariaDB

  3. Flera räkningar inom en enda SQL-fråga

  4. Hur jämför man om två strängar innehåller samma ord i T-SQL för SQL Server 2008?