无法识别功能中的参数

时间:2017-05-04 16:11:58

标签: sql postgresql function parameters

当我尝试拨打下一个功能时

    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)

带前缀,但它不起作用。

1 个答案:

答案 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;