函数参数未在体内解释

Function argument not interpreted inside body

我试图在 PostgreSQL 9.3.6 中创建一个 PL/pgSQL 函数,但是在函数体内使用传递的参数时出现奇怪的行为。这是 'very simple' 函数:

CREATE OR REPLACE FUNCTION myschema.test (myarg text) RETURNS text AS $$
DECLARE
  entity text;
  buffer text;
BEGIN
    CREATE ROLE myarg;
    RETURN myarg;
END;
$$ LANGUAGE plpgsql;

所以,如果 myarg 等于 'test':

我搜索了几个小时为什么会这样,但没有任何线索...安全参数?为什么 myarg 没有解释为创建角色?

正在通过 sql 个文件使用 phpPgAdmin 进行测试是否有任何影响。

你应该使用:

EXECUTE FORMAT('CREATE ROLE %I', myarg);

Here you can find an explanation(尤其是阅读 Craig 的回答)。


正如 Erwin 所说(感谢),%I 比 %s 更安全。无论如何,myarg 应该在函数调用之前进行验证。举个例子

SELECT myschema.test('something; stupid; here;')