语法创建示例之——CREATE PROCEDURE

语法创建示例之——CREATE PROCEDURE,第1张

概述1、背景知识 1) flex: The Fast Lexical Analyzer 2) Bison: A general-purpose parser generator 3) C语言 前二者请自行查阅文档吧,中文资料也很多,OSChina上搜索就可以看到它们的介绍 2、过程 首先,有些语言是区分函数与过程的,有些没有,但它们其实没有本质区别,还是一个东西。对于PG来讲,过程就是RETURNS

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:			CREATEopt_or_replaceFUNCTIONfunc_namefunc_args_with_defaults			RETURNSfunc_returncreatefunc_opt_Listopt_deFinition				{					CreateFunctionStmt*n=makeNode(CreateFunctionStmt);					n->replace=;					n->funcname=;					n->parameters=;					n->returnType=;					n->options=;					n->withClause=;					$$=(Node*)n;				}			|CREATEopt_or_replaceFUNCTIONfunc_namefunc_args_with_defaults			RETURNStable'('table_func_column_List')'createfunc_opt_Listopt_deFinition				{					CreateFunctionStmt*n=makeNode(CreateFunctionStmt);					n->replace=;					n->funcname=;					n->parameters=mergetableFuncParameters(,);					n->returnType=tableFuncTypename();					n->returnType->location=@7;					n->options=;					n->withClause=;					$$=(Node*)n;				}			|CREATEopt_or_replaceFUNCTIONfunc_namefunc_args_with_defaults			createfunc_opt_Listopt_deFinition				{					CreateFunctionStmt*n=makeNode(CreateFunctionStmt);					n->replace=;					n->funcname=;					n->parameters=;					n->returnType=NulL;					n->options=;					n->withClause=;					$$=(Node*)n;				}		;

3、函数语法说明

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

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

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

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

4、我们的过程语法为:

CreateProcedureStmt:			CREATEopt_or_replacePROCEDUREfunc_namefunc_args_with_defaults			createfunc_opt_Listopt_deFinition				{					CreateFunctionStmt*n=makeNode(CreateFunctionStmt);					n->replace=;					n->funcname=;					n->parameters=;					n->returnType=makeTypename("voID");					n->options=;					n->withClause=;					$$=(Node*)n;				}		;

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

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

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

postgres=#CREATEPROCEDUREcheck_proc()ASpostgres-#$$postgres$#DECLAREpassedBOolEAN;postgres$#BEGINpostgres$#SELECTtrueINtopassed;postgres$#END;postgres$#$$LANGUAGEplpgsql;CREATEFUNCTIONpostgres=#


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

总结

以上是内存溢出为你收集整理的语法创建示例之——CREATE PROCEDURE全部内容,希望文章能够帮你解决语法创建示例之——CREATE PROCEDURE所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1175525.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存