On 2019/9/5 16:31, Pavel Stehule wrote:


čt 5. 9. 2019 v 10:25 odesílatel Quan Zongliang <zongliang.q...@postgresdata.com <mailto:zongliang.q...@postgresdata.com>> napsal:

    On 2019/9/5 15:09, Pavel Stehule wrote:
     >
     >
     > čt 5. 9. 2019 v 8:39 odesílatel Quan Zongliang
     > <zongliang.q...@postgresdata.com
    <mailto:zongliang.q...@postgresdata.com>
     > <mailto:zongliang.q...@postgresdata.com
    <mailto:zongliang.q...@postgresdata.com>>> napsal:
     >
     >     Dear hackers,
     >
     >     I found that such a statement would get 0 in PL/pgSQL.
     >
     >     PREPARE smt_del(int) AS DELETE FROM t1;
     >     EXECUTE 'EXECUTE smt_del(100)';
     >     GET DIAGNOSTICS j = ROW_COUNT;
     >
     >     In fact, this is a problem with SPI, it does not support
    getting result
     >     of the EXECUTE command. I made a little enhancement. Support
    for the
     >     number of rows processed when executing INSERT/UPDATE/DELETE
    statements
     >     dynamically.
     >
     >
     > Is there some use case for support this feature?
     >
    A user deletes the data in PL/pgSQL using the above method, hoping
    to do
    more processing according to the number of rows affected, and found
    that
    each time will get 0.

    Sample code:
    PREPARE smt_del(int) AS DELETE FROM t1 WHERE c=$1;
    EXECUTE 'EXECUTE smt_del(100)';
    GET DIAGNOSTICS j = ROW_COUNT;


This has not sense in plpgsql. Why you use PREPARE statement explicitly?

Yes, I told him to do it in other ways, and the problem has been solved.

Under psql, we can get this result

flying=# EXECUTE smt_del(100);
DELETE 1

So I think this may be the negligence of SPI, it should be better to deal with it.


    IF j=1 THEN
        do something
    ELSIF j=0 THEN
        do something

    Here j is always equal to 0.



    Regards

     > Regards
     >
     > Pavel
     >
     >
     >     Regards,
     >     Quan Zongliang
     >




Reply via email to