我有下表。
表格:
CREATE TABLE tblTest
(
Column1 int,
Column2 int,
Column3 int,
Column11 int,
Column111 int,
Column1111 int,
Column22 int,
Column222 int,
Column33 int
);
记录:
INSERT INTO tblTest VALUES(1,2,3,11,111,1111,22,222,33);
我正在编写FUNCTION
以根据传递的参数返回上表中的结果。
参数p_ColumnName
用于传递列名。根据列名称,需要显示列的列表。
功能:
CREATE OR REPLACE FUNCTION ufn_test
(
p_ColumnName text
)
RETURNS -- ? How to specify the dynamic return type or dynamic column list ?
AS
$BODY$
DECLARE v_ColumnsList text;
v_query text;
BEGIN
IF p_ColumnName = 'Column1'
THEN
v_ColumnsList := 'Column11,Column111,Column1111';
ELSIF p_ColumnName = 'Column2'
THEN
v_ColumnsList := 'Column22,Column222';
ELSIF p_ColumnName = 'Column3'
THEN
v_ColumnsList := 'Column33';
END IF;
v_query := 'SELECT '|| v_ColumnsList ||' FROM tblTest';
RETURN QUERY EXECUTE v_query;
END;
$BODY$
LANGUAGE PLPGSQL;
答案 0 :(得分:0)
我建议你在Return中使用类型RefCursor。
根据您使用的语言(SQL,Java ...),您可以从此Cursor获取数据。
所以,你的功能将变为
CREATE OR REPLACE FUNCTION ufn_test( p_ColumnName text )
RETURNS refcursor AS
$BODY$
DECLARE
v_ColumnsList text;
v_query text;
ref_cursor refcursor;
BEGIN
IF (p_ColumnName = 'Column1') THEN
v_ColumnsList := 'Column11,Column111,Column1111';
ELSIF (p_ColumnName = 'Column2') THEN
v_ColumnsList := 'Column22,Column222';
ELSIF (p_ColumnName = 'Column3') THEN
v_ColumnsList := 'Column33';
END IF;
v_query := 'SELECT '|| v_ColumnsList ||' FROM tblTest';
OPEN ref_cursor FOR EXECUTE (v_query);
RETURN ref_cursor;
END;
$BODY$
LANGUAGE plpgsql;
希望它会对你有帮助。