表名作为PostgreSQL函数参数

表名作为PostgreSQL函数参数

我想在Postgres函数中传递一个表名作为参数。我试过这个代码:

CREATE OR REPLACE FUNCTION some_f(param character varying) RETURNS integer 
AS $$
    BEGIN
    IF EXISTS (select * from quote_ident($1) where quote_ident($1).id=1) THEN
     return 1;
    END IF;
    return 0;
    END;$$ LANGUAGE plpgsql;select some_f('table_name');

我得到了这个:

ERROR:  syntax error at or near "."LINE 4: ...elect * from quote_ident($1) where quote_ident($1).id=1)...
    ^********** Error **********ERROR: syntax error at or near "."

这是我在更改为这个时所犯的错误select * from quote_ident($1) tab where tab.id=1:

ERROR:  column tab.id does not exist
LINE 1: ...T EXISTS (select * from quote_ident($1) tab where tab.id...

很可能,quote_ident($1)有效,因为如果没有where quote_ident($1).id=1我得到了1,这意味着某些东西被选中了。为什么第一个quote_ident($1)工作和第二次不是同时进行吗?这怎么能解决呢?


MMTTMM
浏览 3077回答 3
3回答

jeck猫

在plpgsql代码中,执行语句必须用于表名或列来自变量的查询。还有IF EXISTS (<query>)构造不允许在query是动态生成的。这是您的函数,两个问题都解决了:CREATE&nbsp;OR&nbsp;REPLACE&nbsp;FUNCTION&nbsp;some_f(param&nbsp;character&nbsp;varying)&nbsp;RETURNS&nbsp;integer&nbsp; AS&nbsp;$$DECLARE &nbsp;v&nbsp;int;BEGIN &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EXECUTE&nbsp;'select&nbsp;1&nbsp;FROM&nbsp;'&nbsp;||&nbsp;quote_ident(param)&nbsp;||&nbsp;'&nbsp;WHERE&nbsp;' &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;||&nbsp;quote_ident(param)&nbsp;||&nbsp;'.id&nbsp;=&nbsp;1'&nbsp;INTO&nbsp;v; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IF&nbsp;v&nbsp;THEN&nbsp;return&nbsp;1;&nbsp;ELSE&nbsp;return&nbsp;0;&nbsp;END&nbsp;IF;END;$$&nbsp;LANGUAGE&nbsp;plpgsql;
打开App,查看更多内容
随时随地看视频慕课网APP