2009-12-23 31 views
24

Estoy tratando de usar una función con PostgreSQL para guardar algunos datos. Aquí está el script de creación:Cómo llamar a una función, PostgreSQL

-- Function: "saveUser"(integer, character varying, character varying, character varying, character varying, character varying) 

-- DROP FUNCTION "saveUser"(integer, character varying, character varying, character varying, character varying, character varying); 

CREATE OR REPLACE FUNCTION "saveUser"("pUserID" integer, "pName" character varying, "pLastName" character varying, "pUserName" character varying, "pPassword" character varying, "peMail" character varying) 
    RETURNS boolean AS 
$BODY$ 
BEGIN 
SELECT 1 
FROM "USERS" 
WHERE "userID" = $1; 

IF FOUND THEN 
UPDATE "USERS" 
    SET  "name" = $2, 
    "lastName" = $3, 
    "userName" = $4, 
    "password" = $5, 
    "eMail" = $6 
WHERE "userID" = $1; 
ELSE 
    INSERT INTO "USERS" 
    ("name", "lastName", "userName", "password", "eMail") 
    VALUES 
     ($2, $3, $4, $5, $6); 
END IF; 
END;$BODY$ 
    LANGUAGE 'plpgsql' VOLATILE 
    COST 100; 
ALTER FUNCTION "saveUser"(integer, character varying, character varying, character varying, character varying, character varying) OWNER TO postgres; 

estados de documentación PostreSQL que llamar a una función que no devuelve ningún conjunto de resultados, es suficiente para escribir sólo su nombre y sus propiedades. Así que trato de llamar a la función como esta:

"saveUser"(3, 'asd','asd','asd','asd','asd'); 

pero me sale el error abajo:

ERROR: syntax error at or near ""saveUser"" 
LINE 1: "saveUser"(3, 'asd','asd','asd','asd','asd') 
    ^

********** Error ********** 

ERROR: syntax error at or near ""saveUser"" 
SQL state: 42601 
Character: 1 

tengo otras funciones que devuelven un conjunto de resultados. Yo uso SELECT * FROM "fnc"(...) para llamarlos y funciona. ¿Por qué recibo este error?


EDIT: estoy usando la herramienta de consulta pgAdmin III y tratando de ejecutar las sentencias SQL allí.

Respuesta

36

La llamada de función todavía debe ser una instrucción SQL válida:

SELECT "saveUser"(3, 'asd','asd','asd','asd','asd'); 
+0

Usando esto, obtengo el error; "ERROR: la consulta no tiene destino para los datos de resultados". Me pregunto si este error tiene algo que ver conmigo que quiero devolver un booleano. –

+0

Intenté esto con otra función que devuelve vacío y funciona, pero ¿y si quisiera devolver un booleano? –

+2

Erkan: ¿Intentó combinar las dos respuestas? Es decir. su invocación es incorrecta, y no está devolviendo nada para una función que se espera que vuelva bool. Además, ¿por qué tiene identificadores de casos mixtos que tiene que citar todo el tiempo? –

0

declara que su función devuelve booleano, pero nunca devuelve nada.

+0

que inserta la línea, 'VUELTA 1 = 1' en la parte inferior de la definición de la función sólo para probar esto, no sirvió de nada. –

+1

Es cierto, pero el problema informado no es causado por eso. –

4

si su función no quiere volver cualquier cosa que se debe declarar su "vuelve vacía" y luego se le puede llamar así "realizar functionName (parámetro ...); "

+0

Esto no funcionó para mí –

1

Tuve el mismo problema al intentar probar una función muy similar que utiliza una instrucción SELECT para decidir si se debe realizar un INSERT o una ACTUALIZACIÓN. Esta función era una re-escritura de un procedimiento almacenado de T-SQL.
Cuando probé la función desde la ventana de consulta, recibí el error "la consulta no tiene destino para los datos de resultados". Finalmente descubrí que debido a que utilicé una instrucción SELECT dentro de la función, no pude probar la función desde la ventana de consulta hasta que asigné los resultados de SELECT a una variable local usando una instrucción INTO. Esto solucionó el problema.

Si la función original en este hilo se cambió a la siguiente que iba a funcionar cuando se llama desde la ventana de consulta,

$BODY$ 
DECLARE 
    v_temp integer; 
BEGIN 
SELECT 1 INTO v_temp 
FROM "USERS" 
WHERE "userID" = $1; 
7

para PostgreSQL puede utilizar PERFORM. PERFORM solo es válido en el lenguaje de procedimientos PL/PgSQL.

DO $$ BEGIN 
    PERFORM "saveUser"(3, 'asd','asd','asd','asd','asd'); 
END $$; 

La sugerencia del equipo de postgres:

HINT: If you want to discard the results of a SELECT, use PERFORM instead.

Cuestiones relacionadas