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