首页 > 解决方案 > 这个 postgresql 函数有什么问题

问题描述

我做了这个 postgresql 函数,但我得到了这个错误:

错误:不存在游标 «cur_1» 上下文:函数 PL/pgSQL ganancias(text) en la linea 11 en FETCH SQL 状态:34000

CREATE OR REPLACE FUNCTION ganancias(p_jugador text) RETURNS Integer AS
$$
DECLARE
reg1          RECORD;
reg2          RECORD;
cur_1 CURSOR FOR SELECT DISTINCT(id_mano) FROM movimientos where 
nombre_jugador=p_jugador;
cur_2 CURSOR FOR SELECT * FROM movimientos where  id_mano = reg1.id_mano 
and linea =(select min(linea) from movimientos where 
id_mano=reg1.id_mano);
v_cont INTEGER =0;
v_contAux INTEGER=0;
BEGIN
 OPEN cur_1;
 LOOP
  FETCH cur_1 INTO reg1;
  EXIT WHEN NOT FOUND;

OPEN cur_2;
LOOP
     FETCH cur_2 INTO reg2;
     EXIT WHEN NOT FOUND;

    v_cont=reg2.stack;
    v_cont= v_cont - v_contAux;
    v_contAux=reg2.stack;

 END LOOP;
 CLOSE cur_1;
 END LOOP;
 CLOSE cur_2;

RETURN v_cont;
END
$$
LANGUAGE 'plpgsql';

标签: postgresqlfunctionstored-procedures

解决方案


cur_2是 PL/pgSQL 中的游标变量,如果FETCH不知道游标本身的名称,就不能在 SQL 命令中使用它。这很令人困惑,如果不描述大量内部信息,我无法更好地解释它。

只要说您不在FETCHPL/pgSQL 中使用就足够了。这是要走的路:

DECLARE
   reg1 record;
BEGIN
   FOR reg1 IN
      SELECT DISTINCT(id_mano) FROM movimientos
      WHERE nombre_jugador=p_jugador
   LOOP
      /* handle the row */
   END LOOP;
END;

我确信您尝试做的事情可以比嵌套游标循环更有效地表达。


推荐阅读