创建用户定义类型的实例

Create Instance of User-Defined Type

我正在编写一个可以提供给用户的模板脚本,我唯一希望他们接触的是 DECLARE 块。问题是,在脚本主体中,我需要执行一个操作的次数可变(在 FOR 循环中)。我已经创建了一个用户定义的 TYPE,并且正在尝试声明该类型的 ARRAY。我想我只是不知道正确的语法,我花了很多时间搜索如何实例化用户定义类型的变量(或数组元素)。该脚本有几百行长,对少数变量声明进行操作,但作为一个简化的示例(内联添加注释):

CREATE TYPE t_mine AS
(
    key   varchar(50),
    value text
);
DO
$$
    DECLARE
        setting       t_mine;
        settings      t_mine[] := ARRAY [
            -- This syntax is obviously wrong, I've tried others
            -- with varying results, but all failures
            ('Some', 'Value'),
            ('Another', 'One')
        ];
        error_context text;
    BEGIN
        -- Based on Laurenz' answer, the fix is to change the FOR line to
        -- FOREACH setting IN ARRAY settings
        FOR setting IN SELECT settings
            LOOP
                -- This outputs: Key: {"(Some,Value)"}
                RAISE NOTICE 'Key: %', setting."key";

                -- This outputs: Value: <NULL>
                RAISE NOTICE 'Value: %', setting."value";

                -- Exception raised inside some_operation because
                -- the key is invalid.
                PERFORM some_operation(setting."key", setting."value");
            END LOOP;
    EXCEPTION
        WHEN OTHERS THEN
            GET STACKED DIAGNOSTICS error_context = PG_EXCEPTION_CONTEXT;
            RAISE INFO 'Failure';
            RAISE INFO 'Error Name:%',SQLERRM;
            RAISE INFO 'Error State:%', SQLSTATE;
            RAISE INFO 'Error Context:%', error_context;
            ROLLBACK;
    END
$$ LANGUAGE plpgsql;

清理后的日志输出:

[00000] Key: {"(Some,Value)"}
[00000] Value: <NULL>
[00000] Failure
[00000] Error Name:Failed to find the key.
[00000] Error State:P0001
[00000] Error Context:PL/pgSQL function some_operation(character varying,text) line 12 at RAISE
SQL statement "SELECT some_operation(setting."key", setting."value")"
PL/pgSQL function inline_code_block line 124 at PERFORM
completed in 7 ms

谁能告诉我如何正确实例化数组声明中的用户定义类型实例?我需要让用户对 add/remove/change 值保持简单,如果它太复杂,我还不如让它们 add/remove/change 在脚本主体中调用 PERFORM some_operation()

该脚本根据变量确定的逻辑调用了一堆其他函数,但如果我能让它正常工作,下一步将是创建一个新函数,该模板的主体将简单地将变量传递到它。

你的声明和那里的赋值是完美的。问题出在循环中:

loop through an array,使用

FOREACH setting IN ARRAY settings LOOP