如何动态地从 plpgsql 函数中的记录中寻址列?
在以下代码段中,我可以访问一个变量,该变量entity.colname
包含应在 IF 控制结构中检查的列。我正在研究如何foobar
用entity.colname
. 这在plpgsql中可能吗?
IF NEW.foobar IS NULL THEN
RAISE EXCEPTION '% cannot be null', foobar;
END IF;
这是可以但不起作用的东西。
IF NEW.entity.colname IS NULL THEN
RAISE EXCEPTION '% cannot be null', entity.colname;
END IF;
上面的例子只是为了说明我想要实现的目标,不要判断功能。:)
我正在使用 PostgreSQL 9.1。
这很棘手,因为标识符不能是普通 SQL 中的变量。您需要将动态 SQL 与
EXECUTE
- 一起使用,这仍然很棘手,因为变量在EXECUTE
.这是一个演示如何解决这个问题:
在评论中使用@Jack 的想法进行了改进。
您不能使用内置的 plpgsql,
FOUND
因为它不是由EXECUTE
(除了RETURN QUERY EXECUTE
- more here)设置的。这就是我GET DIAGNOSTICS ...
最初使用的原因。但最后用@Jack 的想法简化了。quote_ident()
确保名称在语法上有效并防止SQLi。假设问题是关于触发器的(我不是 100% 确定我理解这个问题),沿着这些思路可能是要走的路:
* 编辑以允许列类型未知的情况(感谢@Erwin!)