当我尝试拨打下一个功能时
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;
有消息说他们不知道id是什么,列或参数。我试着像
一样写作(SELECT s.schedule_id FROM schedule_client_visit s WHERE s.client_id = _id)
带前缀,但它不起作用。
答案 0 :(得分:2)
您有两个选择
1)保持名称“id”,但使用functionName.ArgumentName(所以client_visits.id
)
https://www.postgresql.org/docs/current/static/xfunc-sql.html
[36.4.1]如果参数名称与当前的任何列名相同 在函数内的SQL命令中,列名将优先。 要覆盖它,请使用名称限定参数名称 函数本身,即function_name.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)正如您所尝试的那样,使用了下划线(或其他),但也不要忘记重命名函数头中的参数。
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;