最近遇见的问题,网上少有资料,记录如下:
如果pg function的入参带有逗号,需要
1,传参使用 $$ 引起来
2, 调用的SQL 使用变量 先拼接好,
3,再动态执行:
CREATE OR REPLACE FUNCTION fun_yhc_test1(varchar)
RETURNS varchar AS
$BODY$
--test how to support pg function parameter has ','
DECLARE
v_dept_cd varchar :=$1; --$$'10','12'$$
v_return varchar := '';
vv RECORD;
v_return_sql varchar ;
BEGIN
RAISE NOTICE 'v_dept_cd=%',v_dept_cd ;
IF (v_dept_cd IS NULL OR v_dept_cd = '') THEN
v_dept_cd := ' AND false ';
ELSE
v_dept_cd := ' AND dept_cd in (' || v_dept_cd || ')';
END IF;
v_return_sql := 'select dept_cd from dept where 1 = 1 '||v_dept_cd ;
--FOR vv IN (select dept_cd from dept where str_id = 2 and dept_cd in (v_dept_cd))
FOR vv IN EXECUTE v_return_sql
LOOP
v_return := v_return||'-'||vv.dept_cd ;
RAISE NOTICE 'vv=%',vv.dept_cd ;
END LOOP;
RAISE NOTICE 'v_return=%',v_return ;
RETURN v_return ;
EXCEPTION WHEN OTHERS THEN
RAISE NOTICE 'ERROR = NUM:%, DETAILS:%', SQLSTATE, SQLERRM;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
执行测试:
cmplus_db=# select * from fun_yhc_test1($$'10','11','22'$$);
NOTICE: v_dept_cd='10','11','22'
NOTICE: vv=22
NOTICE: vv=10
NOTICE: vv=11
NOTICE: v_return=-22-10-11
fun_yhc_test1
---------------
-22-10-11
(1 row)
cmplus_db=#