DO $$
DECLARE
rec RECORD;
outcome BOOLEAN;
rule TEXT;
BEGIN
-- Assume the record references a single row that contains the columns under test in the rule
rule := 'columnA > 30 OR columnB < 50';
END;
$$
LANGUAGE plpgsql;
这是一个简洁的块,其中包含我想根据记录评估的规则的示例。我想我需要EXECUTE
一个动态 SQL 语句。
我想在运行时动态确定记录的类型,因为我可以轻松访问带有表名称的另一个字符串。我设想铸造到table_name%ROWTYPE
. 据我所知,我无法在运行时将 RECORD 动态转换为复合类型。
然后我想到使用row_to_json(rec)
,但随后需要针对这个 JSON 对象评估规则。我不熟悉如何在 PL/pgSQL 中执行此操作。
我从 CURSOR 获取到 RECORD 中,因为我想要一个可以传递给没有临时表开销的不同函数的迭代器。我对 PL/pgSQL 相当陌生,我想说该语言只了解了几千个 LOC,所以我仍在学习如何使用它的控制结构。我正在考虑我可能需要备份一下并为问题选择不同的控制和/或数据结构。您将如何解决这个问题?
我们无法转换
record
为定义良好的行类型,只是因为尚未定义转换。匿名输入类型不可能。但一切text
都可以通过基本 I/O 函数进行转换,甚至record
. 所以可以text
作为踏脚石。我们仍然需要动态 SQL 将字符串转换
rule
为 SQL 代码 - 这始终对SQL 注入开放。确保不要从不受信任的来源获取输入!您暗示这
rec
是基于实际的表类型。我们可以使用它(或任何注册的行类型)。说:然后:
小提琴
请注意,记录的列名只是噪音;他们迷失在演员阵容中。转换后只有注册表 (
t1
) 的列名可见。因此,请确保行类型适合!有关的:
很可能有一种更简单的方法。我很少遇到在 PL/pgSQL 中使用显式游标的需要。通常是尝试应用其他 RDBMS 中的模式。