postgresql存储过程执行出错,请各位看看

关注 发布于 2011/06/09 15:09
阅读 5K+
收藏 1
CREATE OR REPLACE FUNCTION "public"."querylog4"()
  RETURNS "pg_catalog"."void" AS $BODY$
declare
 curs1 refcursor;
 aid int DEFAULT 0;
 amsg VARCHAR(300);
 i int;
begin
 i:=0;
 OPEN curs1 for SELECT id,msg FROM sys_sendlogsms_201012 limit 5 offset 5;
 FETCH curs1 into aid,amsg;
 while i<4 loop
   select aid,amsg;
   i:=i+1;
   FETCH curs1 into aid,amsg;
 end loop;
 close curs1;
end;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE COST 100
;
加载中
2
jobell
jobell

给你一个demo你看看。

CREATE OR REPLACE FUNCTION finish_sell_batch(days_formal integer, days_trial integer, now_date date)

  RETURNS void AS

$BODY$

DECLARE

   var_date date;

   var_time timestamp without time zone;

   

   sql_1 text := '';

   record_1 RECORD;

   count_1 integer := 0;

BEGIN

IF now_date IS NULL THEN

RAISE EXCEPTION 'PL/pgSQL error: finish_sell_batch(%, %, ''%'')

reason: parameter error', days_formal, days_trial, now_date;

END IF;

IF days_formal IS NOT NULL THEN

var_date := now_date- (days_formal - 1);

sql_1 := 'select sell_id '

||'from sell_list '

||'where flag_pay_end='||quote_literal_null('0')||' '

||'and version_flag='||quote_literal_null('1')||' '

||'and time_formal<'||quote_literal_null(var_date);

FOR record_1 IN EXECUTE sql_1 LOOP

var_time = 'now';

   perform finish_sell(record_1.sell_id, var_time);

END LOOP;

    END IF;

   

IF days_trial IS NOT NULL THEN

var_date := now_date- (days_trial - 1);

sql_1 := 'select sell_id '

||'from sell_list '

||'where flag_pay_end='||quote_literal_null('0')||' '

||'and version_flag='||quote_literal_null('0')||' '

||'and time_trial<'||quote_literal_null(var_date);

FOR record_1 IN EXECUTE sql_1 LOOP

var_time = 'now';

   perform finish_sell(record_1.sell_id, var_time);

END LOOP;

    END IF;

   

   

   RETURN;

END;

$BODY$

  LANGUAGE plpgsql VOLATILE

  COST 100;

ALTER FUNCTION finish_sell_batch(integer, integer, date) OWNER TO postgres;

COMMENT ON FUNCTION finish_sell_batch(integer, integer, date) IS '完成批处理程序';

1
jobell
jobell
postgresql的count确实是一个问题。这个问题到现在还没有办法。不过有替代方法。上面的链接有,你可以看看。
0
关注
关注
执行:select querylog4();出错提示:[Err] ERROR:  query has no destination for result data
HINT:  If you want to discard the results of a SELECT, use PERFORM instead.
CONTEXT:  PL/pgSQL function "querylog4" line 11 at SQL statement
我没有用过postgresql,刚学不懂
0
关注
关注
这么强大的数据库,居然用的人很少,我抱着试一试态度学习一下,没想到找资料太困难了
0
jobell
jobell
 OPEN curs1 for SELECT id,msg FROM sys_sendlogsms_201012 limit 5 offset 5; 
 FETCH curs1 into aid,amsg; 
 while i<4 loop 
   select aid,amsg; 
   i:=i+1; 
   FETCH curs1 into aid,amsg; 
 end loop; 

 close curs1; 

你这代码怎么写的,看不明白呢

0
jobell
jobell
在plsql中,有动态sql一说,动态sql要用EXECUTE来进行执行的。
0
关注
关注
我是想循环打开的游标,输出每一行的值,在存储过程里面难道不能用select x,b这种写法?
0
jobell
jobell

record_1.sell_id这样就可以拿到了呀。

FOR record_1 IN EXECUTE sql_1 LOOP

var_time = 'now';

    perform finish_sell(record_1.sell_id, var_time);

END LOOP;

0
jobell
jobell

引用来自“关注”的答案

我是想循环打开的游标,输出每一行的值,在存储过程里面难道不能用select x,b这种写法?

好好看一下postgresql帮助文档,里面都有说明的。

0
关注
关注
非常感谢,刚接触不懂,再向你请教一个问题:mysql和postgresql同样一个表,大约2900万行数据,按同样的字段建的索引,然后按索引字段进行查询,查询的值也一样,mysql只要2s而postgresql用了115s,不知道为什么?
宏哥
宏哥
你的表是不是没有主键?
宏哥
宏哥
我在512m的笔记本虚拟机上上一个count,600多万,大概1.5S就够了
返回顶部
顶部