我正在尝试创建一个 UDF,该 UDF 可以VIEW
动态创建使用USING
子句功能。问题是,EXECUTE
不会接受传递给CREATE VIEW
命令的参数。
CREATE OR replace FUNCTION test(name varchar) RETURNS void LANGUAGE plpgsql AS $$
BEGIN
EXECUTE format('create or replace view %I as select $1 as id limit 1;',$1) using $1;
RETURN;
END
$$;
测试:
select test('tabel_view');
电流输出:
SQL 错误 [42P02]:错误:没有参数 $1
其中:执行时的 PL/pgSQL 函数测试(字符变化)第 3 行
同样适用于CREATE TABLE
:
CREATE OR REPLACE FUNCTION test(name varchar) RETURNS void LANGUAGE plpgsql AS $$
BEGIN
EXECUTE format('create table %I as select $1 as id limit 1;',$1) using $1;
RETURN;
END
$$;
我尝试这种方式是因为字符串连接很容易出现 SQL 注入。另外,我正在处理的 UDF 将有一个数组作为输入。
知道如何解决这个问题吗?
USING
of 子句用于EXECUTE
将值传递给DML 命令(“实用命令”)。手册:不适用于 DDL 命令,例如
CREATE VIEW
.SELECT
in 中的语句的不同CRATE TABLE
之处在于,它被视为(并执行)为实际的嵌套SELECT
语句,其中实现了参数插值。它属于“包含其中之一的某些命令”。将值连接为字符串文字:
小提琴
字符串文字默认为 type
text
。如果您需要不同的类型(例如您提到的数组类型),请添加显式类型转换。