我正在使用光标,提取一列' email1' table' pepe_emails'共10件。在循环内部,我尝试追加在数组中提取的内容。
之前的错误是我在这篇文章中提到的那个。顺便说一句,问题在于,当使用'退出时,取消循环变为无限循环;' 。 我没有找到' 时试图绕过'退出。但是我没有得到类似这个想法的东西:'退出时cursor_emails =='&#39 ;;'。这在postgresql中是不对的,但是像写得好的东西会起作用。在输出显示,这里应该打破:
NOTICE: Loop 10
NOTICE: Value: ()
这是我当前和失败的代码:
do $$
declare
cursor_emails cursor for
select pepe_emails.email1
from pepe_emails;
arr_emails varchar[];
table_record record;
i integer := 0;
begin
raise notice 'Hola 1';
open cursor_emails;
loop
raise notice 'Loop %', i;
i = i + 1;
fetch cursor_emails into table_record;
raise notice 'Value: %', table_record;
perform array_append (arr_emails, table_record::varchar);
raise notice 'Value: %', arr_emails[-1];
exit when not found;
end loop;
close cursor_emails;
end;
$$;
这是此代码的输出:
NOTICE: Hola 1
NOTICE: Loop 0
NOTICE: Value: (us_1.gmail.com)
NOTICE: Value: <NULL>
NOTICE: Loop 1
NOTICE: Value: (us_2.gmail.com)
NOTICE: Value: <NULL>
NOTICE: Loop 2
NOTICE: Value: (us_3.gmail.com)
NOTICE: Value: <NULL>
NOTICE: Loop 3
...
NOTICE: Value: (us_9.gmail.com)
NOTICE: Value: <NULL>
NOTICE: Loop 9
NOTICE: Value: (us_10.gmail.com)
NOTICE: Value: <NULL>
NOTICE: Loop 10
NOTICE: Value: ()
NOTICE: Value: <NULL>
NOTICE: Loop 11
NOTICE: Value: ()
NOTICE: Value: <NULL>
提前完成
答案 0 :(得分:0)
FOUND
在每个PL / pgSQL函数调用中开始为false。它由以下每种语句设置:[...]
- 如果
PERFORM
语句生成(并丢弃)一行或多行,则FOUND
语句设置为FETCH
,如果没有生成行,则为false。[...]
- 如果
FOUND
语句返回一行,则FETCH
语句设置为PERFORM
,如果没有返回行,则设置为false。
因此,为了获得所需的结果,您必须将测试移到void setFunction(void(*cbfun)(float*,int,int,int,int)){ ... }
后面,否则class base_t {
public:
void setCallback(){
setFunction(&_callback);
}
private:
void _callback(float * a, int b, int c, int d, int e) { ... }
};
会更改该值。