按名称访问 PL/pgSQL 对象中的对象字段
Accessing object fields by name in PL/pgSQL object
我想通过 PL/SQL 函数中的文本变量传入的名称访问对象的 fields/properties。例如,而不是:
obj.fieldA
我想做这样的事情:
obj['fieldA']
有没有办法在 PL/SQL 中完成此操作?我正在使用 Postgres,所以也许我应该说 PL/pgSQL,但我希望存在通用语法。
据我所知,编译语言PL/SQL不允许。通常这是动态语言的一个特性。 PLpgSQL 也不支持此功能,但有一些解决方法:
动态SQL
CREATE TABLE foo(a int, b varchar, c date);
INSERT INTO foo VALUES(10, 'Hello', CURRENT_DATE);
DO $$
DECLARE
foo_rec foo%ROWTYPE;
colname text DEFAULT 'b';
value text;
BEGIN
SELECT * FROM foo INTO foo_rec;
EXECUTE format('SELECT ().%I::text', colname) INTO value USING foo_rec;
RAISE NOTICE '% = %', colname, value;
END;
$$;
转换为 JSON
并从 JSON
中读取值
DO $$
DECLARE
foo_rec foo%ROWTYPE;
colname text DEFAULT 'b';
j json;
BEGIN
SELECT * FROM foo INTO foo_rec;
j := row_to_json(foo_rec);
RAISE NOTICE '% = %', colname, j->>colname;
END;
$$;
今天使用JSON
是最舒服的方式。
我想通过 PL/SQL 函数中的文本变量传入的名称访问对象的 fields/properties。例如,而不是:
obj.fieldA
我想做这样的事情:
obj['fieldA']
有没有办法在 PL/SQL 中完成此操作?我正在使用 Postgres,所以也许我应该说 PL/pgSQL,但我希望存在通用语法。
据我所知,编译语言PL/SQL不允许。通常这是动态语言的一个特性。 PLpgSQL 也不支持此功能,但有一些解决方法:
动态SQL
CREATE TABLE foo(a int, b varchar, c date); INSERT INTO foo VALUES(10, 'Hello', CURRENT_DATE); DO $$ DECLARE foo_rec foo%ROWTYPE; colname text DEFAULT 'b'; value text; BEGIN SELECT * FROM foo INTO foo_rec; EXECUTE format('SELECT ().%I::text', colname) INTO value USING foo_rec; RAISE NOTICE '% = %', colname, value; END; $$;
转换为
JSON
并从JSON
中读取值DO $$ DECLARE foo_rec foo%ROWTYPE; colname text DEFAULT 'b'; j json; BEGIN SELECT * FROM foo INTO foo_rec; j := row_to_json(foo_rec); RAISE NOTICE '% = %', colname, j->>colname; END; $$;
今天使用JSON
是最舒服的方式。