首页 > 解决方案 > 将 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; $$; 

标签: sqlpostgresqlplpgsqlref-cursor

解决方案


作为一种解决方法,我在下面做了

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; $$; 

推荐阅读