PL / pgSQL函数中未终止的美元引用字符串

时间:2015-07-08 14:46:09

标签: postgresql plpgsql postgresql-8.2

我正在尝试创建一个函数来从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中运行此查询和函数。感谢。

2 个答案:

答案 0 :(得分:1)

将所有ELSE IF替换为ELSIF。你有两种形式IF statement不匹配。

答案 1 :(得分:0)

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

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

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