如何将返回表与整数的SQL Server存储过程转为PostgreSQL函数?
解决方案:PostgreSQL存储过程实现
原SQL Server存储过程的核心逻辑是:执行查询返回结果集,同时根据查询行数返回状态码1(匹配1行)或9(无匹配/多行匹配)。在PostgreSQL中,使用**存储过程(PROCEDURE)**可以完美复刻该行为,因为存储过程支持直接输出SELECT结果集,同时通过OUT参数返回状态码。
1. 创建存储过程
CREATE OR REPLACE PROCEDURE public.img_iwd_get_chqbook( IN branch_code varchar(3), IN customer_no varchar(15), IN account_no varchar(10), IN cheque_no varchar(6), IN txn_code varchar(2), OUT return_code integer) LANGUAGE plpgsql AS $$ DECLARE row_count integer; BEGIN -- 执行查询并输出展开的结果集(列名与原逻辑保持一致) SELECT start_no AS chq_start_leaf_num, end_no AS chq_end_leaf_num, prefix AS chq_pfx_num FROM mchequebook WHERE branch_code = $1 AND customer_no = $2 AND account_no = $3 AND prefix = $5 AND $4 BETWEEN start_no AND end_no; -- 获取查询返回的行数 GET DIAGNOSTICS row_count = ROW_COUNT; -- 根据行数设置状态码 return_code := CASE WHEN row_count = 1 THEN 1 ELSE 9 END; END; $$;
2. 调用方式
使用CALL语句执行存储过程,同时接收状态码:
-- 在psql中用变量接收返回码 \set return_code 0 CALL public.img_iwd_get_chqbook('BR0', 'CUST12345', 'ACC000123', '100001', 'CH', :return_code); -- 查看返回的状态码 SELECT :return_code;
关于自定义类型的问题说明
你之前遇到的「有数据时结果都在一列」的问题,是因为如果用函数返回自定义复合类型,PostgreSQL会将整行数据打包成单个列输出,而非展开为独立列。而上述存储过程直接执行SELECT语句,会像SQL Server一样输出展开的多列结果集,同时通过OUT参数返回状态码,完全匹配原逻辑。
内容的提问来源于stack exchange,提问作者Vinuka Osura
相关产品推荐
相关产品推荐

