Postgresql PL/pgSQL函数中未终止的美元引号字符串
我试图创建一个函数,从PostgreSQL中不同表中的某些列派生代码。在阅读了该语言的教程和文档之后,我想我已经足够理解了如何实现一个函数。不幸的是,在pgAdmin或Aginity中运行查询会导致未终止的美元引号字符串错误 下面是函数: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
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中的函数。