我在从Oracle(过程(迁移的PostgreSQL中运行以下提到的函数:
CREATE OR REPLACE FUNCTION proc_get_attachments
(
OUT op_user_data refcursor
,OUT op_error_code text
,OUT op_error_desc text
)
returns record
LANGUAGE plpgsql
AS $$
DECLARE
v_error_code varchar(10) := '0';
begin
OPEN op_user_data
FOR
SELECT file_complete_name, article_ref_id, file_name, file_path, content,file_extension
FROM TBL_ATTACHMENT_MIG;
RAISE EXCEPTION 'excp_action' USING ERRCODE = '50001';
EXCEPTION
WHEN SQLSTATE '50001' then
op_error_code := v_error_code;
op_error_desc :=
fn_error_detail(op_error_code,'PKG_MIGRATION_EGAIN','PROC_GET_ATTACHMENTS');
WHEN OTHERS THEN
op_error_code := v_error_code;
op_error_desc := fn_error_detail(op_error_code,'PKG_MIGRATION_EGAIN','PROC_GET_ATTACHMENTS');
END;
$$
;
fn_error_detail是一个常见的函数,它根据代码和其他参数从全局错误消息表中获取数据。
使用以下命令执行函数时:select * from proc_get_attachments();
获取输出:
op_user_data |op_error_code|op_error_desc |
------------------|-------------|--------------------------------|
<unnamed portal 1>|0 |Attachments fetched successfully|
然后在运行命令时:fetch all in "<unnamed portal 1>"
;
返回的错误是: SQL 错误 [34000]: 错误: 游标 " 不存在
问题是:光标未返回数据,但文本输出正确显示
如果 PL/pgSQL 块中存在异常,则自打开该块的BEGIN
以来的所有内容都将回滚。
因此,游标未绑定 —OPEN
已撤消。