我收到如下错误:[42883]错误:运算符不存在:文本|| integer []提示:没有运算符匹配给定的名称和参数类型。您可能需要添加显式类型转换。我无法解决此问题,并尝试了很多次。
我的代码:
DECLARE
arr_operators integer[1,2];
BEGIN
query1 := 'SELECT * FROM dist.' || _rec1.table_name || ' WHERE operator_id = ANY (''' || arr_operators || ''');';
FOR _rec IN EXECUTE query1 LOOP
END LOOP;
我认为当我使用查询字符串时会发生问题。但是当我在查询中直接使用此语句时,下面的lik效果很好:
FOR _rec1 IN (SELECT * FROM dist.sirdarya WHERE id = any (arr_operators)) LOOP
INSERT INTO dist.justt(column1,column2) VALUES (_rec1.id,_rec1.msisdn);
END LOOP;
感谢您的帮助。
答案 0 :(得分:2)
我建议取消嵌套数组而不是连接字符串,这可能导致SQL注入:
SELECT *
FROM table_name
WHERE operator_id IN (SELECT * FROM unnest(arr_operators));
这部分特别危险:
query1 := 'SELECT * FROM dist.' || _rec1.table_name
如果表名称为;DROP DATABASE ...;--
,该怎么办?
它可以改写为:
query1 := FORMAT('SELECT * FROM dist.%I ...', _rec1.table_name);