文档章节

语法创建示例之——CREATE PROCEDURE

有理想的猪
 有理想的猪
发布于 2015/08/18 07:05
字数 651
阅读 680
收藏 2

1、背景知识

1) flex: The Fast Lexical Analyzer

2) Bison: A general-purpose parser generator

3) C语言

前二者请自行查阅文档吧,中文资料也很多,OSChina上搜索就可以看到它们的介绍

2、过程

首先,有些语言是区分函数与过程的,有些没有,但它们其实没有本质区别,还是一个东西。对于PG来讲,过程就是RETURNS VOID函数,因此CREATE PROCEDURE其实也就是创建一个同义词。我们来看CREATE FUNCTION(src/backend/paser/gram.y):

CreateFunctionStmt:
			CREATE opt_or_replace FUNCTION func_name func_args_with_defaults
			RETURNS func_return createfunc_opt_list opt_definition
				{
					CreateFunctionStmt *n = makeNode(CreateFunctionStmt);
					n->replace = $2;
					n->funcname = $4;
					n->parameters = $5;
					n->returnType = $7;
					n->options = $8;
					n->withClause = $9;
					$$ = (Node *)n;
				}
			| CREATE opt_or_replace FUNCTION func_name func_args_with_defaults
			  RETURNS TABLE '(' table_func_column_list ')' createfunc_opt_list opt_definition
				{
					CreateFunctionStmt *n = makeNode(CreateFunctionStmt);
					n->replace = $2;
					n->funcname = $4;
					n->parameters = mergeTableFuncParameters($5, $9);
					n->returnType = TableFuncTypeName($9);
					n->returnType->location = @7;
					n->options = $11;
					n->withClause = $12;
					$$ = (Node *)n;
				}
			| CREATE opt_or_replace FUNCTION func_name func_args_with_defaults
			  createfunc_opt_list opt_definition
				{
					CreateFunctionStmt *n = makeNode(CreateFunctionStmt);
					n->replace = $2;
					n->funcname = $4;
					n->parameters = $5;
					n->returnType = NULL;
					n->options = $6;
					n->withClause = $7;
					$$ = (Node *)n;
				}
		;

3、函数语法说明

可以看出,我们需要做的事情很少,第一是定义PROCEDURE关键字,第二是找到VOID参数定义

1) 定义 PROCEDURE 关键字,我们可以从程序中看到它其实已经定义过了,跟FUNCTION同属于非保留关键字,印象中v9.2还无此定义。PG关键字的分类可以自行阅读文档,此外gram.y当中的定义还有很多讲究,需要注意的地方挺多;

2) 无返回值是一个特殊的系统类型:void,我们在创建函数时直接指定即可;

3) 函数语法我们只需要第一个,因为后两个都是有返回值的;

4、我们的过程语法为:

CreateProcedureStmt:
			CREATE opt_or_replace PROCEDURE func_name func_args_with_defaults
			createfunc_opt_list opt_definition
				{
					CreateFunctionStmt *n = makeNode(CreateFunctionStmt);
					n->replace = $2;
					n->funcname = $4;
					n->parameters = $5;
					n->returnType = makeTypeName("void");
					n->options = $6;
					n->withClause = $7;
					$$ = (Node *)n;
				}
		;

当然还需要在stmt定义里边添加CreateProcedureStmt,在 %type<node>里边添加CreateProcedureStmt定义。

这些学习bison或者yacc语法就能知道怎么回事,最简单的是像这样找一个相似语法照葫芦画瓢。

5、make & make install,创建一个无返回值函数测试一下:

postgres=# CREATE PROCEDURE check_proc() AS 
postgres-# $$
postgres$# DECLARE passed BOOLEAN;
postgres$# BEGIN
postgres$#         SELECT  true  INTO passed;
postgres$# END;
postgres$# $$  LANGUAGE plpgsql;
CREATE FUNCTION
postgres=#


至此,作为一个语法结构,它已经可以运行了,当然很多细节还需要处理,作为一个示例到这里就足够说明问题,不再继续。


© 著作权归作者所有

共有 人打赏支持
有理想的猪
粉丝 135
博文 86
码字总数 29655
作品 0
红挢
高级程序员
MySQL之函数、存储过程和触发器

MySQL中函数、存储过程和触发器现在用得不多了,做了解就可以,因为现在数据库性能是很多系统的瓶颈了,这些操作都可以在数据库外由专业的编程语言如java等来完成,以减轻数据库负担,数据库...

化澄风
06/30
0
0
很全面的mysql数据库的一些操作

很全面的mysql数据库的一些操作 零、用户管理: 1、新建用户: >CREATE USER name IDENTIFIED BY 'ssapdrow'; 2、更改密码: >SET PASSWORD FOR name=PASSWORD('fdddfd'); 3、权限管理 >SHO......

幸运券发放
07/26
0
0
MySQL数据库的常用命令语句记录——安全用户语句及函数

安全用户语句及函数 CREATE USER:创建用户 CREATE USER 'user'[@'host'] [ IDENTIFIED BY [PASSWORD] 'password'][,....] CREATE USER 'dream'@'localhost' IDENTIFIED BY '123456','dream1......

无聊书生
2015/08/24
0
0
SYBASE存储过程详解

SYBASE存储过程 一、存储过程简介 二、存储过程的创建、修改、删除 三、存储过程中的参数、返回值和变量 四、存储过程中的流程控制语言 五、存储过程中的事务、游标 六、ASE存储过程和IQ存储...

wangxuwei
2016/03/18
391
0
Java程序员从笨鸟到菜鸟之(九)——数据库有关知识补充(事务、视图、索引、存储过程)

本文来自:曹胜欢博客专栏。转载请注明出处:http://blog.csdn.net/csh624366188 一:事务 首先看一下什么是事务: 通俗的理解,事务是一组原子操作单元,从数据库角度说,就是一组SQL指令,...

长平狐
2012/11/12
55
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

7 个致命的 Linux 命令

导读 如果你是一个 Linux 新手,在好奇心的驱使下,可能会去尝试从各个渠道获得的命令。以下是 7 个致命的 Linux 命令,轻则使你的数据造成丢失,重则使你的系统造成瘫痪,所以,你应当竭力避...

问题终结者
今天
0
0
设计模式:工厂方法模式(工厂模式)

工厂方法模式才是真正的工厂模式,前面讲到的静态工厂模式实际上不能说是一种真正意义上的设计模式,只是一种变成习惯。 工厂方法的类图: 这里面涉及到四个种类: 1、抽象产品: Product 2、...

京一
今天
0
0
区块链和数据库,技术到底有何区别?

关于数据库和区块链,总会有很多的困惑。区块链其实是一种数据库,因为他是数字账本,并且在区块的数据结构上存储信息。数据库中存储信息的结构被称为表格。但是,区块链是数据库,数据库可不...

HiBlock
今天
0
0
react native 开发碰到的问题

react-navigation v2 问题 问题: static navigationOptions = ({navigation, navigationOptions}) => ({ headerTitle: ( <Text style={{color:"#fff"}}>我的</Text> ), headerRight: ( <View......

罗培海
今天
0
0
Mac Docker安装流程

久仰Docker大名已久,于是今天趁着有空,尝试了一下Docker 先是从docker的官网上下载下来mac版本的docker安装包,安装很简易,就直接拖图标就好了。 https://www.docker.com/products/docker...

writeademo
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部