sql - 将 refcursor 获取到临时表中
问题描述
我需要将 refcursor 提取到临时表中。每个 refcursor 列应该匹配适当的表列 + 一个键(枚举)列应该在临时表中。例如 refcursor 返回以下数据:
'one' 'Monday'
'two' 'Friday'
以及应该存储在表中的数据:
1 'one' 'Monday'
2 'two' 'Friday'
这个 refcursor 在其他函数中打开。所以我不知道结果集中应该有哪些列。我如何实现 FETCH ALL curs INTO temp_table 之类的东西?
我写了下面的函数,但它抛出了 (V_CURS_Rec) 的错误。*
CREATE OR REPLACE FUNCTION FN_TEST()
RETURNS VOID LANGUAGE plpgsql
AS $$
DECLARE
V_CURS REFCURSOR;
V_CURS_Rec RECORD;
ITER INTEGER;
BEGIN
create temporary table if not exists TMP_TBL
(
INDX INTEGER NOT NULL,
CNAME VARCHAR(20),
CDAY VARCHAR(20),
);
DELETE FROM TMP_TBL;
SELECT * FROM FN_RET_REFCURSOR() INTO V_CURS;
ITER := 1;
LOOP
FETCH V_CURS INTO V_CURS_Rec;
EXIT WHEN NOT FOUND;
INSERT INTO TMP_TBL SELECT ITER, (V_CURS_Rec).*;
ITER := ITER + 1;
END LOOP;
RETURN;
END; $$;
解决方案
作为一种解决方法,我在下面做了
CREATE OR REPLACE FUNCTION FN_TEST()
RETURNS VOID LANGUAGE plpgsql
AS $$
DECLARE
V_CURS REFCURSOR;
V_Rec_CNAME VARCHAR(20);
V_Rec_CDAY VARCHAR(20);
ITER INTEGER;
BEGIN
create temporary table if not exists TMP_TBL
(
INDX INTEGER NOT NULL,
CNAME VARCHAR(20),
CDAY VARCHAR(20)
);
DELETE FROM TMP_TBL;
SELECT * FROM FN_RET_REFCURSOR() INTO V_CURS;
ITER := 1;
LOOP
FETCH V_CURS INTO V_Rec_CNAME, V_Rec_CDAY;
EXIT WHEN NOT FOUND;
INSERT INTO TMP_TBL VALUES (ITER, V_Rec_CNAME, V_Rec_CDAY);
ITER := ITER + 1;
END LOOP;
RETURN;
END; $$;
推荐阅读
- python - 使用 PyMuPDF 将文本添加到 pdf
- javascript - 如何将http重定向到https加上将`index.html`重定向到.htaccess中的另一个html页面?
- grafana - 为什么 briangann-datatable-panel 排序在 grafana 中不起作用?
- python - mysql中的大表每次都基于csv更新行
- c++ - 右值引用、复制和移动
- javascript - 为什么我在 Flutter 中运行 _webViewController.evaluateJavascript(source: s) 时得到 NULL?
- spring-boot - 如何使用 Spring Boot 在 OpenAPI UI 中显示 Json
- erlang - 在 phoenix 控制器测试中使用夹具创建用户并在 @valid_attrs 中使用 id
- javascript - 存在 Express 会话问题的节点
- google-calendar-api - 客人可以修改的活动不会通过谷歌日历 API 更新