我对 PostgreSQL tidscan的理解

PostgreSQL中,有一种 tidscan。当我在使用cursor的时候,会用到此种scan:

[postgres@lex pgsql]$ cat ./data/test.sqlCREATE OR REPLACE Function FindCourse

   ( name_in IN varchar )

   RETURNS integer LANGUAGE plpgsql AS $$

DECLARE

    cnumber integer;

    c1 CURSOR

    FOR

       SELECT course_number, instructor

        from course_tbl

        where course_name = name_in

        FOR UPDATE;



BEGIN



BEGIN

open c1;

fetch c1 into cnumber;



IF not found THEN

     cnumber := 9999;

ELSE

     UPDATE course_tbl

        SET instructor = 'SMITH'

        WHERE CURRENT OF c1;

    COMMIT;

END IF;



close c1;



EXCEPTION

WHEN OTHERS THEN

END;

RETURN cnumber;

END;$$;

[postgres@lex pgsql]$ 

 下面再进行一下修正:

在PostgreSQL的 function 里面,是不允许进行commit的。所以其实,上面的程序需要改成:

[postgres@lex pgsql]$ cat ./data/test.sqlCREATE OR REPLACE Function FindCourse

   ( name_in IN varchar )

   RETURNS integer LANGUAGE plpgsql AS $$

DECLARE

    cnumber integer;

    c1 CURSOR

    FOR

       SELECT course_number, instructor

        from course_tbl

        where course_name = name_in

        FOR UPDATE;



BEGIN



BEGIN

open c1;

fetch c1 into cnumber;



IF not found THEN

     cnumber := 9999;

ELSE

     UPDATE course_tbl

        SET instructor = 'SMITH'

        WHERE CURRENT OF c1;

END IF;



close c1;



EXCEPTION

WHEN OTHERS THEN

END;

RETURN cnumber;

END;$$;

[postgres@lex pgsql]$ 

 

你可能感兴趣的:(PostgreSQL)