Almacenar el resultado de la consulta en una variable usando PL / pgSQL

130

¿Cómo asignar el resultado de una consulta a una variable en PL / pgSQL, el lenguaje de procedimiento de PostgreSQL?

Tengo una funcion:

CREATE OR REPLACE FUNCTION test(x numeric)
RETURNS character varying AS
$BODY$
DECLARE
name   character varying(255);
begin
 name ='SELECT name FROM test_table where id='||x;

 if(name='test')then
  --do somthing
 else
  --do the else part
 end if;
end;
return -- return my process result here
$BODY$
LANGUAGE plpgsql VOLATILE

En la función anterior, necesito almacenar el resultado de esta consulta:

'SELECT name FROM test_table where id='||x;

a la variable name.

¿Cómo procesar esto?

Sathish
fuente

Respuestas:

198

Creo que estás buscando SELECT INTO:

select test_table.name into name from test_table where id = x;

Eso extraerá namede test_tabledonde idestá el argumento de su función y lo dejará en la namevariable. No deje de lado el prefijo del nombre de la tabla test_table.nameo recibirá quejas sobre una referencia ambigua.

mu es demasiado corto
fuente
2
¿Qué pasa si necesito múltiples variables? ¿Como select test_table.name, test_table.id, test_table.ssn?
Dao Lam
2
@DaoLam: De la documentación que me gustaba: "El resultado de un comando SQL que produce una sola fila (posiblemente de varias columnas) puede asignarse a una variable de registro, variable de tipo fila o lista de variables escalares".
mu es demasiado corto
@muistooshort, ¿estás diciendo que puedo hacer lo mismo y puedo usar name.id, name.ssn para recuperar? Lo intenté con IF EXISTS pero no funcionó: IF EXISTS (seleccione * en el nombre de test_table ...))
Dao Lam
@DaoLam ¿Por qué combina INTO con IF EXISTS? Tal vez debería hacer una nueva pregunta para poder explicar lo que está tratando de hacer.
Mu es demasiado corto
3
No hay ningún ejemplo en la documentación (o me lo perdí), pero como señaló @muistooshort, puede seleccionar múltiples variables con una sola selección:SELECT test_table.column1, test_table.column2 INTO variable1, variable2 FROM test_table WHERE id = x;
Grengas
78

Mientras asigne una sola variable, también puede usar la asignación simple en una función plpgsql:

name := (SELECT t.name from test_table t where t.id = x);

O use SELECT INTOcomo @mu ya proporcionado .

Esto también funciona:

name := t.name from test_table t where t.id = x;

Pero mejor use uno de los primeros dos métodos más claros, como comentó @Pavel.

Acorté la sintaxis con un alias de tabla adicionalmente.
Actualización: eliminé mi ejemplo de código y sugiero usar IF EXISTS()en su lugar como lo proporciona @Pavel .

Erwin Brandstetter
fuente
1
Esta no es una buena idea, esta característica no está documentada y es fea
Pavel Stehule
2
PL / pgSQL permite la combinación de SQL y PL, y a veces puede crear criaturas realmente extrañas, pero es mejor mezclar PL y SQL limpiamente, en declaraciones aisladas.
Pavel Stehule
@PavelStehule: Estoy de acuerdo, su forma es preferible.
Erwin Brandstetter
En realidad, prefiero su sintaxis, pero el problema es que cuando usted maneja errores, su declaración no envía FOUND a true en el opuesto de la instrucción select into, checkout ( postgresql.org/docs/9.1/plpgsql-statements.html )
SENHAJI RHAZI Hamza
18

El patrón habitual es EXISTS(subselect):

BEGIN
  IF EXISTS(SELECT name
              FROM test_table t
             WHERE t.id = x
               AND t.name = 'test')
  THEN
     ---
  ELSE
     ---
  END IF;

Este patrón se utiliza en PL / SQL, PL / pgSQL, SQL / PSM, ...

Pavel Stehule
fuente
2

Crear tabla de aprendizaje:

CREATE TABLE "public"."learning" (
    "api_id" int4 DEFAULT nextval('share_api_api_id_seq'::regclass) NOT NULL,
    "title" varchar(255) COLLATE "default"
);

Insertar tabla de aprendizaje de datos:

INSERT INTO "public"."learning" VALUES ('1', 'Google AI-01');
INSERT INTO "public"."learning" VALUES ('2', 'Google AI-02');
INSERT INTO "public"."learning" VALUES ('3', 'Google AI-01');

Paso 01

CREATE OR REPLACE FUNCTION get_all (pattern VARCHAR) RETURNS TABLE (
        learn_id INT,
        learn_title VARCHAR
) AS $$
BEGIN
    RETURN QUERY SELECT
        api_id,
        title
    FROM
        learning
    WHERE
        title = pattern ;
END ; $$ LANGUAGE 'plpgsql';

Paso 02

SELECT * FROM get_all('Google AI-01');

Paso 03

DROP FUNCTION get_all();

Manifestación: ingrese la descripción de la imagen aquí

Ram Pukar
fuente
-2

Puede usar el siguiente ejemplo para almacenar un resultado de consulta en una variable usando PL / pgSQL:

 select * into demo from maintenanceactivitytrack ; 
    raise notice'p_maintenanceid:%',demo;
rinku Choudhary
fuente