【问题标题】:PL/PGSQL create array type tablePL/PGSQL 创建数组类型表
【发布时间】:2017-12-10 06:23:03
【问题描述】:

我正在将 Oracle 架构迁移到 PostgreSQL 9.5。目前,我正在尝试迁移下一个函数(已经在 plpgsql 中):

CREATE OR REPLACE FUNCTION Control_Reports_Pg.idd_in_crm_not_in_cc_fn (P_Dir_Name text, P_File_Name text, P_Table_Title text ) RETURNS bigint AS $body$

        DECLARE
        TYPE Area_Table IS TABLE OF VARCHAR2(3) INDEX BY BINARY_INTEGER;

         Area_Array Area_Table
         C_Report CURSOR(V_Area text) FOR
           SELECT NAP_AREA2, NAP_PHONE_NUM, NAP_HEKER
           FROM PS_RF_INST_PROD
           WHERE NAP_AREA2 = V_Area
         EXCEPT
           SELECT AREA, PHONE, btrim(HEKER_NO)
           FROM MANUIM
           WHERE AREA = V_Area;


          V_Counter          bigint:=0;
          V_Step             bigint;
          V_File_Type        UTL_FILE.FILE_TYPE;
          V_Dir_Name         varchar(50) :=P_Dir_Name;
          V_File_Name        varchar(60) := P_File_Name;
          V_Table_Title      varchar(250) := P_Table_Title;
          V_Count_Columns    bigint:=4; -- count of the fields in report
          C_Function_Name    varchar(200) := 'Idd_In_Crm_Not_IN_CC_Fn';
          Array_Count RECORD;
          Rec_Report RECORD;

    BEGIN

    V_Step := 1;

    Area_Array(1) := '02';
    Area_Array(2) := '03';
    Area_Array(3) := '04';
    Area_Array(4) := '08';
    Area_Array(5) := '09';
    Area_Array(6) := '50';
    Area_Array(7) := '52';
    Area_Array(8) := '54';
    Area_Array(9) := '57';
    Area_Array(10) := '74';
    Area_Array(11) := '77';

     FOR Array_Count IN 1..11 LOOP

      FOR Rec_Report IN C_Report(Area_Array(Array_Count)) LOOP
      .......

但是,我知道在 PostgreSQL 中我不能声明类型表。我在网上搜索并看到了一个创建临时表并将该表插入到我的变量中的解决方案,但我不太了解 pgplsql,因此我不知道该怎么做。

【问题讨论】:

  • Area_Array Area_Table -> Area_Array varchar(3)[];, Area_Array(1) := '02'; Area_Array(2) := '03'; ... -> Area_Array := '{02,03,...}';Area_Array(Array_Count) -> Area_Array[Array_Count]Arrays
  • 关于这部分 Area_Array := '{02,03,...}' ,里面的值不是应该用引号引起来的吗? Area_Array := '{'02','03'...}
  • 这是唯一的方法吗?
  • 1) 仅当值包含一些分隔符(空格、逗号等)时:选择 select array['01a','02 03', '22"33']; -> {01a,"02 03","22\"33"}(您可以使用 array[...] 语法来确定您在做什么)2)否,还有很多其他的方法。

标签: postgresql plpgsql ora2pg


【解决方案1】:

您不需要为此声明单独的类型,只需使用数组即可:

Area_Array varchar[];

限制长度并没有真正的好处,因此varchar(3)[]varchar[]text[] 相比没有任何好处。

然后你可以像这样初始化数组:

Area_Array := array['02','03','04','08','09','50','52', '54', '57','74','77';

iterate over the array你可以使用foreach:

foreach v_area in areay_array 
loop
   for Rec_Report in SELECT NAP_AREA2, NAP_PHONE_NUM, NAP_HEKER
                     FROM PS_RF_INST_PROD
                     WHERE NAP_AREA2 = V_Area
                     except 
                     SELECT AREA, PHONE, btrim(HEKER_NO)
                     FROM MANUIM
                     WHERE AREA = V_Area
   loop
   ....
   end loop; -- for rec_report

end loop;

【讨论】:

    猜你喜欢
    • 2012-08-12
    • 2012-03-27
    • 2012-05-21
    • 1970-01-01
    • 2021-01-21
    • 1970-01-01
    • 2017-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多