文档章节

语法创建示例之——CREATE PROCEDURE

有理想的猪
 有理想的猪
发布于 2015/08/18 07:05
字数 651
阅读 757
收藏 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=#


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


© 著作权归作者所有

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

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

化澄风
06/30
0
0
Oracle专题15之包

1、包的概述 a、什么是包? 包是一组相关过程、函数、变量、常量和游标等PL/SQL程序设计元素的组合。 b、包的特点? 它具有面向对象程序设计语言的特点,是对PL/SQL程序设计元素(过程、函数...

极客微信条
2017/12/20
0
0
oracle: Oracle 用户、对象权限、系统权限

Oracle 用户、对象权限、系统权限 --================================ --Oracle 用户、对象权限、系统权限 --================================ 一、用户与模式 用户:对数据库的访问,需要...

liango
2012/09/24
0
0
Oracle 用户、对象权限、系统权限

--================================ --Oracle 用户、对象权限、系统权限 --================================ 一、用户与模式 用户:对数据库的访问,需要以适当用户身份通过验证,并具有相...

王阔
2012/07/15
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

没有更多内容

加载失败,请刷新页面

加载更多

技术工坊|如何降低区块链应用的使用门槛(上海)

当区块链技术从专业研究走向市场应用,开发者需要考虑用户的使用场景和使用门槛,例如通过ETH支付gas手续费,或者注册一个16进制的用户名,普通用户都难以接受。 10月20日,HiBlock区块链社区...

HiBlock
26分钟前
1
0
Daemon线程--《Java并发编程的艺术》学习笔记

daemon线程即守护线程 当一个JVM中不存在非Daemon线程时,JVM将会退出 也就是说当非Daemon线程都执行完毕时,java程序也就结束了。 可以通过调用Thread.setDaemon(true)将线程设置为Daemon线...

karma123
32分钟前
0
0
scala类型参数的上界和下界

class Pair[T <: Comparable[T]](val first:T,val second:T) //类型T必须要是Comparable接口的子类(即T是Comparable的下界){ def bigger = if(first.compareTo(second) > 0) first e......

whoisliang
42分钟前
1
0
Vue中路由管理器Vue Router使用介绍(一)

一、在模块编程中安装VueRouter 1.Npm安装vue-router npm install vue-router 2.在main.js中引用并使用VueRouter import Vue from 'vue'import VueRouter from 'vue-router'Vue.use(Vu......

tianma3798
44分钟前
1
0
TypeScript基础入门之声明合并(一)

转发 TypeScript基础入门之声明合并(一) 声明合并 介绍 TypeScript中的一些独特概念描述了类型级别的JavaScript对象的形状。 TypeScript特别独特的一个例子是"声明合并"的概念。 在使用现有J...

durban
58分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部