+ -
当前位置:首页 → 问答吧 → PostgreSQL源代码分析之 PL/pgSQL虚拟机实现

PostgreSQL源代码分析之 PL/pgSQL虚拟机实现

时间:2010-12-07

来源:互联网

PostgreSQL PL/pgSQL虚拟机实现

闫华 [email protected]

1前言
PostgreSQL是当今最为先进的开源数据库管理系统,PL/pgSQL是PostgreSQL中最重要的过程语言,它类似于Oracle的PL/SQL,用户可以用它来创建触发器和用户自定义函数。
PostgreSQL使用一个虚拟机来运行PL/pgSQL函数,该虚拟机是解释型的虚拟机,没有类似于机器语言的指令集,在编译过程结束以后,直接以语法树为基础运行PL/pgSQL函数。


2 PL/pgSQL简介

PL/pgSQL 是块结构的语言。完整的函数定义必须是一个块。

下面是一个用PL/pgSQL编写的函数的实例:
CREATE FUNCTION somefunc() RETURNS integer AS $$
<< outerblock >>
DECLARE
    quantity integer := 30;
BEGIN
    RAISE NOTICE 'Quantity here is %', quantity;  -- Prints 30
    quantity := 50;
    --
    -- Create a subblock
    --
    DECLARE
        quantity integer := 80;
    BEGIN
        RAISE NOTICE 'Quantity here is %', quantity;  -- Prints 80
        RAISE NOTICE 'Outer quantity here is %', outerblock.quantity;  -- Prints 50
    END;

    RAISE NOTICE 'Quantity here is %', quantity;  -- Prints 50

    RETURN quantity;
END;
$$ LANGUAGE plpgsql;

有关PL/pgSQL的详细的语法介绍,可以去查看官方文档,此处不再赘述。


3虚拟机工作流程
当用户使用CREATE FUNCTION函数创建一个PL/pgSQ函数以后,PostgreSQL首先编译该函数,如果没有错误,该函数的源代码将被存放到系统表pg_proc中。当用户要执行一个已将创建好的函数时,PostgreSQL首先从系统表pg_proc取出该函数的源代码,重新编译源代码,然后根据编译生成的语法树,运行该函数。因为编译源代码是一个消耗大量CPU资源的操作,PostgreSQL在启动以后,数据库内部会建立一个缓冲区,其中存放编译过的PL/pgSQ函数的语法树。每次在编译一个PL/pgSQ函数的时候,首先检查缓冲区,看看该函数是否已经被编译过,如果已经被编译过,则从缓冲区中直接取出它的语法树,这样便可以省去重新编译的过程,提高执行的效率。

作者: snail_aaa   发布时间: 2010-12-07

这个有关系吗?看不出是PG的源码啊。

作者: renxiao2003   发布时间: 2010-12-07