-1

我正在尝试创建一个函数来从 PostgreSQL 中各种表中的某些列中派生代码。在阅读了该语言的教程和文档之后,我认为我理解得足够好,可以制作一个功能来完成它应该做的事情。不幸的是,在 pgAdmin 或 Aginity 中运行查询会产生未终止的美元引号字符串错误。

这是功能:

CREATE OR REPLACE FUNCTION getBreakdownCodes(cat_cd TEXT, service TEXT, report_application_cd TEXT) RETURNS TEXT AS $$
    DECLARE
        breakdown TEXT;
    BEGIN
        IF cat_cd IN ('CPE')
            THEN breakdown := 'CPE';
        ELSE IF SUBSTRING(cat_cd FROM 1 FOR 2) IN ('CC','CM')                       
            THEN breakdown := 'CPE';
        ELSE IF service = 'IPVPN'
            THEN breakdown := 'IP';
        ELSE IF service = 'INTERNET'
            THEN breakdown := 'IP';
        ELSE IF POSITION('IQ' IN service) > 0
            THEN breakdown := 'IP';
        ELSE IF cat_cd IN ('DWB','HL1','HL3','HX1','HX3','ETH','IPG')
            THEN breakdown := 'IP';
        ELSE IF cat_cd in ('BVP','APN','AVO')
            THEN breakdown := 'BVP';
        ELSE IF SUBSTRING(cat_cd FROM 3 FOR 1) = 'X' AND SUBSTRING(service FROM 1 FOR 2) = 'DS'
            THEN breakdown := 'PL';
        ELSE IF SUBSTRING(cat_cd FROM 3 FOR 1) = 'P'
            THEN breakdown := 'PL';
        ELSE IF SUBSTRING(cat_cd FROM 1 FOR 2) = 'FR' OR service = 'FRAME RELAY'
            THEN breakdown := 'FRAME_ATM';
        ELSE IF SUBSTRING(cat_cd FROM 1 FOR 1) = '8'
            THEN breakdown := '8XX';
        ELSE IF SUBSTRING(cat_cd FROM 1 FOR 2) = 'DA'
            THEN breakdown := 'VOICE';
        ELSE IF SUBSTRING(cat_cd FROM 3 FOR 1) = 'L'
            THEN breakdown := 'LOOP';
        ELSE IF report_application_cd IN ('DAL','PRIVATE LINE') AND POSITION('FRAME' IN service) > 0
            THEN breakdown := 'FRAME_ATM';
        ELSE IF report_application_cd IN ('DAL','PRIVATE LINE') AND POSITION('ATM' IN service) > 0
            THEN breakdown := 'FRAME_ATM';
        ELSE IF report_application_cd IN ('DAL','PRIVATE LINE') AND POSITION('INTERNET' IN service) > 0
            THEN breakdown := 'IP';
        ELSE breakdown := 'OTHER';
        END IF;
        RETURN breakdown;
    END;
$$ LANGUAGE plpgsql;

我试图将美元报价更改为 $body$ 和 $func$ 以查看是否修复了任何问题,但可惜没有。

有解决办法吗?我将在 Postgres 版本 8.2.15 和 8.3.23 中运行这个查询和函数。谢谢。

4

2 回答 2

1

全部替换ELSE IFELSIF。您不匹配两种形式的IF statement.

于 2015-07-08T15:07:02.813 回答
0

在 pgAdmin 中,我遇到的问题与我在 Aginity 中遇到的问题略有不同。默认情况下,Aginity 只发送查询到第一个分号,然后停止。所以问题是让它作为一个批次发送。(Ctrl+F5)

然后错误切换到语言 plpgsql 不存在。但是,该语言确实存在于远程,并且不在本地环境中,因此我将在本地环境中安装该语言。

该代码在远程(8.2.15)环境中工作并创建了该函数。

于 2015-07-08T16:20:33.347 回答