PostgreSQL:语法在尝试访问数组中的字段时出错

时间:2017-05-10 08:23:39

标签: postgresql syntax-error plpgsql database-migration

我正在从Oracle 9i迁移到PostgreSQL 9.3,我需要迁移一些包含其内容的包。

我正在使用Ora2PG进行大部分工作,但是需要手动迁移软件包,考虑代码对Oracle的具体程度。

我有一个名为RelevCaspTyp的用户定义类型,其定义如下:

CREATE TYPE pkgstesa5152com.relevcasptyp AS (
   -- SOME OTHER DATA
   d1           timestamp,
   d2           timestamp,
   d1min        timestamp,
   d2min        timestamp,
   d1max        timestamp,
   d2max        timestamp,
   -- SOME OTHER DATA
);

然后,我在另一个Type:

中创建了这种类型的对象数组
CREATE TYPE pkgstesa5152com.relevcasptabtyp AS (relevcasptabtyp pkgstesa5152com.relevcasptyp[]);

最后,这是触发语法错误的函数:

CREATE OR REPLACE FUNCTION PkgStesa5152Com.calculd1d2 (RelevCaspTab INOUT pkgstesa5152com.RelevCaspTabTyp, i integer) AS $body$
BEGIN
IF RelevCaspTab[i].d1max IS NULL OR RelevCaspTab[i].d1min >= RelevCaspTab[i].d1max THEN
   RelevCaspTab[i].d1 := RelevCaspTab[i].d1min;
ELSE
   RelevCaspTab[i].d1 := RelevCaspTab[i].d1max;
END IF;
IF RelevCaspTab[i].d2max IS NULL OR RelevCaspTab[i].d2min >= RelevCaspTab[i].d2max THEN
   RelevCaspTab[i].d2 := RelevCaspTab[i].d2min;
ELSE
   RelevCaspTab[i].d2 := RelevCaspTab[i].d2max;
END IF;
END;
$body$
LANGUAGE PLPGSQL
;

当我尝试在PostgreSQL数据库中导入此函数时,收到此消息:

ERROR:  syntax error at or near "."
LINE 5:    RelevCaspTab[i].d1 := RelevCaspTab[i].d1min;
                          ^

看起来很奇怪,似乎LINE 4(带有IF / THEN)正确传递,除非这是另一个误报并且问题实际上在其他地方。

编辑:看起来问题实际上来自于对RelevCaspTab [i] .d1的值的影响。如果我评论函数中的所有影响,则会成功创建。

1 个答案:

答案 0 :(得分:1)

if r[i].d1max is null or r[i].d1min >= r[i].d1max then
   r[i] := (r[i].d1min,r[i].d2,r[i].d1min,r[i].d2min,r[i].d1max,r[i].d2max);

修改

正如评论中所建议的那样:

create type relevCaspTyp as (
   d1           timestamp,
   d1min        timestamp,
   d1max        timestamp
);

create or replace function calculd1d2 (
    r inout relevCaspTyp[], i integer
) as $body$
declare a relevCaspTyp;
begin
    a := r[i];
    if a.d1max is null or a.d1min >= a.d1max then
       a.d1 := a.d1min;
    else
       a.d1 := a.d1max;
    end if;
    r[i] := a;
end;
$body$
language plpgsql
;

with r (r) as (values (array[('2017-01-01','2017-01-04','2017-01-03')::relevCaspTyp]))
select calculd1d2(r,1)
from r;
                                  calculd1d2                                   
-------------------------------------------------------------------------------
 {"(\"2017-01-04 00:00:00\",\"2017-01-04 00:00:00\",\"2017-01-03 00:00:00\")"}