Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql PL/pgSQL函数中未终止的美元引号字符串_Postgresql_Plpgsql_Postgresql 8.2 - Fatal编程技术网

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

Postgresql PL/pgSQL函数中未终止的美元引号字符串,postgresql,plpgsql,postgresql-8.2,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

我试图创建一个函数,从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中运行此查询和函数。谢谢。

将所有
ELSE IF
替换为
ELSIF
。您将两种形式的问题不匹配。

在pgAdmin中,我得到的问题与在Aginity中得到的问题略有不同。默认情况下,Aginity只发送第一个分号以内的查询,然后停止。因此,问题是如何将其作为单个批次发送。(Ctrl+F5)

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


该代码在远程(8.2.15)环境中工作,并创建了该功能。

不相关,但:为什么使用过时且不再维护的版本?(8.2的维护在4年前就停止了)@a_horse_与_no_name这是我们的业务运行的基础,我们这些在postgres中使用某些数据库脚本的人必须在我们的测试环境中运行它,以确保兼容性。这确实是一个限制,但我们的团队无法修复。我尝试将所有内容更改为ELSIF并再次运行它,但它出现了相同的错误。ELSIF的语法在Aginity中也没有突出显示。@BJ:这确实有效-至少在受支持的版本中是这样的:@a_horse_和_no_name,这很令人沮丧。@BJ-你与ELSIF的函数在语法上确实正确,我已经在我的Postgres客户端中检查过了。您的问题可能是由于客户端程序对分号的错误解释造成的。尝试psql中的函数。