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函数的时候,首先检查缓冲区,看看该函数是否已经被编译过,如果已经被编译过,则从缓冲区中直接取出它的语法树,这样便可以省去重新编译的过程,提高执行的效率。
闫华 [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
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28