zoukankan      html  css  js  c++  java
  • 我对 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]$ 
  • 相关阅读:
    gitlab
    MySQL千万级别大表,你要如何优化?
    kafka入门
    zookeeper的原理和应用
    MySQL 性能优化之慢查询
    Redis一些新的看法
    mysql 数据库锁
    MYSQL查看进程和kill进程
    hadoop批量命令脚本xcall.sh及jps找不到命令解决
    java stream 处理分组后取每组最大
  • 原文地址:https://www.cnblogs.com/gaojian/p/3130635.html
Copyright © 2011-2022 走看看