'未找到时退出;'不起作用以及如何使用smth绕过它,例如当光标= =''

时间:2018-02-07 22:10:55

标签: sql postgresql

我正在使用光标,提取一列' 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>

提前完成

1 个答案:

答案 0 :(得分:0)

The documentation说:

  

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) { ... } }; 会更改该值。