2015-09-04 83 views
2

嗨,我正在创建一个插入元数据的过程。我创建了类型,并且我在另一个类型中包含了1个类型,并且在我正在迭代它以获取值的过程中。由于我是PostgreSQL的新手,任何人都可以帮助我了解如何调用这个过程。输入参数的类型为用户定义类型作为PostgreSQL函数中的输入参数

Create Type Form_details as(
        formName character varying(100), 
        submittedBy numeric, 
         createdDate date,  
        updatedBy numeric, 
        updatedDate date, 
        comments character varying(500), 
        Sections Section[] 

) 

create type Section as (
          sectionName character varying(100), 
          sectionLabel character varying(100),       
          sectionOrder numeric       



        ) 

和我写的程序是

CREATE OR REPLACE FUNCTION form_insertion(formdetails form_details[]) 
    RETURNS character varying AS 
$BODY$ 

DECLARE 
     form_details_seq integer; 
     section_seq integer; 
     formName character varying(100); 
     submittedBy numeric; 
     createdDate date;  
     comments character varying(500); 
       formStatusId numeric; 

     sectionOrder numeric; 
     sectionName character varying(100); 
     sectionLabel character varying(100); 
     attributeId numeric; 

     I integer; 
     J integer; 
begin 
FOR I IN 1..formdetails.COUNT 

LOOP 

formName    :=formdetails[I].formName; 
formStatusId   :=formdetails[I].formStatusId; 
comments    :=formdetails[I].comments; 
    RAISE NOTICE '%', formName; 

    FOR J IN 1..formdetails.Section.COUNT 
    LOOP 

    sectionName    :=formdetails[I].Section[J].sectionName; 
RAISE NOTICE '%', sectionName; 

    END LOOP ; 


END LOOP; 

Return formName,sectionName; 
end; 
$BODY$ 
    LANGUAGE plpgsql VOLATILE 
    COST 100; 

这是不完整的过程。但我试图用这个来测试。您能否让我知道我的方法是否正确,以及如何从数据库端进行测试。我将如何传递此参数。顺便说一下,我创建的类型来自Java对象。这个过程将从Java端调用。任何帮助将不胜感激。

回答

1

要从SQL查询中调用函数,必须将参数转换为您的自定义类型,如下例所示。

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) 
]) 

请注意,PostgreSQL数组没有.COUNT属性。您可以通过索引范围迭代一个数组与array_upper功能:

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; 

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

因为PostgreSQL 9.1,你可以通过数组使用foreach语句循环