[解决] pg function的入参带有逗号

最近遇见的问题,网上少有资料,记录如下:

如果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=# 

猜你喜欢

转载自blog.csdn.net/keaihuilang/article/details/96161792