62

Cómo almacenar el resultado de la consulta en la variable usando PostgreSQL Procedimiento almacenadotienda el resultado de la consulta en la variable aplicando el procedimiento PostgreSQL almacenados

tengo un procedimiento almacenado

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 eles part 
end if; 
end; 
return -- return my process result here 
$BODY$ 
LANGUAGE plpgsql VOLATILE 

en el procedimiento anterior i necesidad de almacenar

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

esta consulta regresar resultado con el nombre de la variable

cómo procesar esto? por favor hágamelo saber

Respuesta

91

Creo que estás buscando SELECT INTO:

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

que se tire de la name de test_table donde id es el argumento de la función y dejarlo en la variable name. No omita el prefijo del nombre de la tabla en test_table.name o recibirá quejas sobre una referencia ambigua.

+3

gracias poderoso !!!!!!!!! – Sathish

+1

¿Qué sucede si necesito múltiples variables? Como seleccionar test_table.name, test_table.id, test_table.ssn? –

+1

@DaoLam: De la documentación que me gustaba: "El resultado de un comando SQL que produce una sola fila (posiblemente de varias columnas) se puede asignar a una variable de registro, variable de tipo de fila o lista de variables escalares". –

36

Mientras está asignando una única variable, también se puede usar la asignación normal en una función plpgsql:

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

O utilice SELECT INTO como @mu already provided.

Esto funciona, también:

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

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

He acortado 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 provided by @Pavel.

+0

Esto no es una buena idea - esta característica no está documentado y es feo –

+2

PL/pgSQL permite la mezcla de SQL y PL - y, a veces puede crear criaturas realmente extrañas, pero es mejor mezclar PL y SQL limpiamente - en declaraciones aisladas. –

+0

@PavelStehule: Estoy de acuerdo, su forma es preferible. –

14

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, ...

1

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 datos Tabla de aprendizaje:

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(); 

Demostración: enter image description here

Cuestiones relacionadas