user defined type as input parameters in PostgreSQL function

后端 未结 1 1112
佛祖请我去吃肉
佛祖请我去吃肉 2021-01-13 01:23

Hi I am creating a procedure for insertion of meta data. I created types and I included 1 type in another type and in procedure I am iterating it to get the value. Since I a

相关标签:
1条回答
  • 2021-01-13 01:55

    To call the function from a SQL query, you must cast the parameters to your custom type as in the following example.

    select form_insertion(array[
        cast(row('Form 1', 1, current_date, 1, current_date, 'This is form 1', 
            array[
                cast(row('section-1', 'Section One', 1) as section),
                cast(row('section-2', 'Section Two', 2) as section),
                cast(row('section-3', 'Section Three', 3) as section)
            ]
        ) as form_details),
        cast(row('Form 2', 2, current_date, 1, current_date, 'This is form 2', 
            array[
                cast(row('section-2', 'Section Two', 2) as section),
                cast(row('section-3', 'Section Three', 3) as section)
            ]
        ) as form_details),
        cast(row('Form 3', 1, current_date, 1, current_date, 'This is form 3', 
            array[
                cast(row('section-1', 'Section One', 1) as section),
                cast(row('section-3', 'Section Three', 3) as section)
            ]
        ) as form_details)
    ])
    

    Note that PostgreSQL arrays don't have a .COUNT property. You can iterate through an array by index range with array_upper function:

    for i IN 1..array_upper(formdetails, 1)
    LOOP 
       -- your code here
    END LOOP;
    

    Since PostgreSQL 9.1, you can use the FOREACH statement to loop through the array:

    create or replace function form_insertion(formdetails form_details[])
        returns varchar as $$
    declare
        detail form_details;
        sec section;
    begin
        foreach detail in array formdetails
        LOOP 
           RAISE NOTICE '%', detail.formName;
    
           foreach sec in array detail.sections
           LOOP
             raise NOTICE '%', sec.sectionName;
           END LOOP;
        END LOOP;
        return '';
    end;$$
        language plpgsql;
    
    0 讨论(0)
提交回复
热议问题