2017-05-04 1 views
0

Quand je tente d'appeler la fonction suivantene peut pas reconnaître le paramètre en fonction

CREATE OR REPLACE FUNCTION client_visits(id INT) 
RETURNS 
    TABLE("date_visit" Date, "time_visit" Time, "visit_type" VARCHAR(30) ) 
AS $$ BEGIN 
RETURN QUERY SELECT schedule.date_visit, schedule.time_visit, schedule.visit_type FROM schedule 
WHERE schedule.id IN (SELECT s.schedule_id FROM schedule_client_visit s WHERE s.client_id = id); 
RAISE Notice 'id =%', id; END $$ LANGUAGE plpgsql; 

Il y a un message qu'ils ne savent pas ce que id est, colonne ou paramètre. J'ai essayé d'écrire comme

(SELECT s.schedule_id FROM schedule_client_visit s WHERE s.client_id = _id) 

avec le préfixe, mais son ne fonctionne pas.

+0

si je change cet ID dans la sous-requête sur un nombre et puis j'appellerais la fonction, son fonctionnement. Le problème est donc 100% dans ce paramètre – AndrewMontana

Répondre

2

Vous avez deux options

1) garder le nom "id", mais reportez-vous à l'aide functionName.ArgumentName (si client_visits.id)

https://www.postgresql.org/docs/current/static/xfunc-sql.html

[36.4.1] Si le nom de l'argument est le même que tout nom de colonne dans la commande SQL en cours dans la fonction, le nom de la colonne aura priorité. Pour remplacer cela, qualifiez le nom de l'argument avec le nom de la fonction elle-même, c'est-à-dire nom_fonction.argument_name.

CREATE OR REPLACE FUNCTION client_visits(id INT) 
RETURNS 
    TABLE("date_visit" Date, "time_visit" Time, "visit_type" VARCHAR(30) ) 
AS $$ BEGIN 
RETURN QUERY SELECT schedule.date_visit, schedule.time_visit, schedule.visit_type FROM schedule 
WHERE schedule.id IN (SELECT s.schedule_id FROM schedule_client_visit s WHERE s.client_id = client_visits.id); 
RAISE Notice 'id =%', client_visits.id; END $$ LANGUAGE plpgsql; 

2) que vous avez essayé, utilisé un trait de soulignement (ou autre), mais ne pas oublier de renommer l'argument dans l'en-tête de la fonction aussi bien.

CREATE OR REPLACE FUNCTION client_visits(_id INT) 
RETURNS 
    TABLE("date_visit" Date, "time_visit" Time, "visit_type" VARCHAR(30) ) 
AS $$ BEGIN 
RETURN QUERY SELECT schedule.date_visit, schedule.time_visit, schedule.visit_type FROM schedule 
WHERE schedule.id IN (SELECT s.schedule_id FROM schedule_client_visit s WHERE s.client_id = _id); 
RAISE Notice 'id =%', _id; END $$ LANGUAGE plpgsql; 
+0

3) Utiliser un espace réservé: '... O WH s.client_id = $ 1' – Abelisto

+0

Merci beaucoup – AndrewMontana