PostgreSQL存储过程(一):概念简介

通用概念介绍:

  1. SQL:全称叫结构化查询语言(Structured Query Language),是用来访问关系型数据库一种通用语言,因为语法更接近自然语言所以学习门槛较低。属于非过程化语言,即可以直接通过简单的调用相应语句来直接取得结果,目前流行的SQL语言标准为可读性较好的ANSI SQL-99标准。
  2. PL/SQL:全称叫过程化SQL语言(Procedural Language/SQL),它是一种过程化语言。PL/SQL增加了逻辑判断、循环等功能,使其具有Java、C++、Python等高级语言所具有的逻辑处理能力,可以用来实现较为复杂的业务。注:PL/SQL只能在存储过程中编写。
  3. 存储过程:是对PL/SQL程序块的封装,可以输入参数、输出参数。存储过程被保存在数据库中,一次编译可多次使用。

PostgreSQL存储过程介绍:

        在PostgreSQL数据库中的存储过程又称函数(Function),存储过程不属于标准SQL,不同的数据库管理系统会在标准SQL的基础上扩展专属的私有功能,因此会有不同系统的差异性。

摘自官网的Function语法介绍如下:

CREATE [ OR REPLACE ] FUNCTION
    name ( [ [ argmode ] [ argname ] argtype [ { DEFAULT | = } default_expr ] [, ...] ] )
    [ RETURNS rettype
      | RETURNS TABLE ( column_name column_type [, ...] ) ]
  { LANGUAGE lang_name
    | TRANSFORM { FOR TYPE type_name } [, ... ]
    | WINDOW
    | IMMUTABLE | STABLE | VOLATILE | [ NOT ] LEAKPROOF
    | CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT
    | [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER
    | PARALLEL { UNSAFE | RESTRICTED | SAFE }
    | COST execution_cost
    | ROWS result_rows
    | SUPPORT support_function
    | SET configuration_parameter { TO value | = value | FROM CURRENT }
    | AS 'definition'
    | AS 'obj_file', 'link_symbol'
  } ...

注:官网语法介绍列出了所有的可选参数和关键字,因此在理解上会有些困惑。此外,由于笔者水平有限,较少用到的函数并未深入探索其使用方法,作为用户只需要熟练使用常用的基本功能即可,因此Function的使用可以参考接下来的几篇常用脚本范例。

主要参数介绍:

name:Function的名称,命名规范和数据表的规范一致;

argmode:参数的模式,有IN、OUT、INOUT、VARIADIC四种模式,分别表示输入参数、输出参数、输入输出参数和可变参数(可以输入{1,2,3}形式的数组,实际上很少使用),并且OUT和INOUT不能和RETURNS一块使用,默认的缺省参数模式为IN;

argname:参数的名称,省略后在脚本中可以使用$1、$2等来访问传入的参数,从程序可读性的角度,不建议省去参数名称;

argtype:参数的类型,可选值为常用的postgresql数据类型、集合、符复合类型等;

default:用来指定参数的默认值,只有IN、INOUT模式的参数可以指定,示例用法为param_name int default 4或者param_name int = 4,即可指定参数的默认值为4,当函数调用是没有传入参数则赋予默认值4;

rettype:指定返回数据的类型,可选值为常用的postgresql数据类型、集合、符复合类型等,可以使用SETOF指明返回一个数组,没有要返回的值可以使用void,不能和OUT、INOUT同时使用

column_name及column_type:在使用RETURNS TABLE时指定表中的字段名称和类型;

lang_name:指定使用的语言,一般写'sql'、'plpgsql',也可以写其他语言入如Python、c等语言(笔者并未尝试除SQL以外的其他语言);

TRANSFORM:少用

WINDOW:少用

IMMUTABLE、STABLE、VOLATILE:是用于查询优化器的参数,在数据分析查询中由于需求经常变动,推荐使用VOLATILE以避免查询优化器带来的数据不一致。

  1. IMMUTABLE:表示函数不能修改数据库,并且当给定相同的实参值时总是返回相同的结果;也就是说,它不进行数据库查找,也不使用参数列表中不直接显示的信息。如果给出这个选项,任何带全常量参数的函数调用都可以立即替换为函数值。

  2. STABLE:表示该函数不能修改数据库,并且在单个表扫描中,对于相同的参数值,它将始终返回相同的结果,但是它的结果可以跨SQL语句更改。对于结果依赖于数据库查找、参数变量(如当前时区)等的函数来说,这是合适的选择(对于希望查询被当前命令修改的行的AFTER触发器来说,就不适合使用)。还要注意,current_timestamp函数族限定为稳定函数,因为它们的值在事务中不会改变。

  3. VOLATILE(常用):表示函数值即使在一次表扫描中也可以更改,因此不能进行优化。在这个意义上,相对较少的数据库函数是不稳定的;例如random(), currval(), timeofday()。但是要注意,任何有副作用的函数必须被分类为volatile,即使它的结果是相当可预测的,以防止调用被优化掉;setval()就是一个例子。

LEAKPROOF:少用

CALLED ON NULL INPUT、RETURNS NULL ON NULL INPUT、STRICT:指定输入参数为null时的处理方式。

  1. CALLED ON NULL INPUT:(默认值)表示当函数的一些参数为空时,该函数将被正常调用。

  2. RETURNS NULL ON NULL INPUT:表示当函数的任何参数为NULL时,函数总是返回NULL。如果指定了这个形参,则当有空参数时,函数不会执行,自动返回NULL。

  3. STRICT:表示当函数的任何参数为NULL时,函数总是返回NULL。如果指定了这个形参,则当有空参数时,函数不会执行,自动返回NULL。

[EXTERNAL] SECURITY INVOKER、[EXTERNAL] SECURITY DEFINER:用来指定执行权限,少用

PARALLEL:用来指定函数的是否可以并行执行。

  1. PARALLEL UNSAFE:(默认值)表示该函数不能以并行模式执行,如果SQL语句中存在这样的函数,则会强制执行串行执行计划。

  2. PARALLEL RESTRICTED:表示该功能可以并行执行,但并行执行的权限受限(不太理解,原文为but the execution is restricted to parallel group leade)。

  3. PARALLEL SAFE:表示函数在并行模式下运行是安全的,不受限制。

COST execution_cost:函数的估计执行耗费CPU资源数值,一般用一个正数值,少用

ROWS result_rows:期望函数返回的估计行数。只有当函数声明为返回set时才允许这样做。默认为1000行。

SUPPORT support_function:少用

configuration_parameter:少用
value:少用

definition:少用

obj_filelink_symbol:少用

你可能感兴趣的:(PostgreSQL,postgresql,sql)