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

news/2024/7/9 20:22:08 标签: postgresql, sql

通用概念介绍:

  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语法介绍如下:

sql">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:参数的类型,可选值为常用的sql>postgresql数据类型、集合、符复合类型等;

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

rettype:指定返回数据的类型,可选值为常用的sql>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:少用


http://www.niftyadmin.cn/n/896549.html

相关文章

电脑上怎么设置自动按某个键_干货:电脑键盘F1F12的用处太多了

电脑键盘顶排中有F1到F12多个功能按键,由于普通用户平常运用较少,因此很多朋友对电脑键盘F1-F12的功能不太了解,真正知道所有用途可能就没几个人。F1Help1,当我们正处在某个程序中时,需要帮助的情况下,可以…

PostgreSQL存储过程(二):创建函数入门

准备工作——创建用户数据库和模式: 在数据库中新建用来学习的数据库mydb,并在mydb数据库中新增mysc,即my database和my schema的缩写,接下来的示例脚本将在mydb数据库下的mysc模式下创建。脚本如下, -- 1.创建自己的数…

python短视频自动制作_短视频篇 | Python 带你进行短视频二次创作

1目 标 场 景无论是抖音还是快手等视频平台,一旦一个视频火了后,很多 UP 主都会争先抢后去模仿拍摄或剪辑,然后上传到平台,最后都能带来不错的流量。对于一般的短视频,完全可以通过裁剪、特效转场、加入混合图层和字幕…

PostgreSQL存储过程(三):使用匿名代码块

匿名代码块介绍: 匿名代码块是在PostgreSQL 9.X版本引入的新功能【注:9.0以下不支持,可通过select version()脚本确认自己使用的数据库版本】,通过DO关键字指定执行代码块,其功能和函数类似,相当于轻量版的…

Attempt to invoke virtual method ‘android.content.res.XmlResourceParser android.content.pm.ProviderI

android的报错提示: java.lang.NullPointerException: Attempt to invoke virtual method ‘android.content.res.XmlResourceParser android.content.pm.ProviderInfo.loadXmlMetaData(android.content.pm.PackageManager, java.lang.String)’ on a null object reference …

vba ado返回集合_VBA中地址Address的含义,

大家好,今日继续和大家分享VBA编程中常用的常用"积木"过程代码。这些内容大多是我的经验和记录,来源于我多年的经验。今日分享的是NO.227-NO.228,内容是:NO. 227:在工作表的SelectionChange事件中当返回的区…

PostgreSQL存储过程(四):追加指定日期区间数据

需求介绍: 本次的目标是实现追加指定区间内的历史数据,且仅保存指定日期区间内月份月末一天的数据的函数。在文章三中介绍了方便一次性使用的匿名代码块,但匿名代码块对脚本的封装能力有限,本次使用普通的函数进行实现。【注&…

python老牌语言_编程语言世界杯,Python击败老牌劲旅Java夺冠

本文1346字,阅读大概需要 4 分钟。世界杯激战正酣,克罗地亚突围成功,与年轻的法国队会师决赛。周日晚北京时间23:00将会决出本届世界杯的冠军。谁将会捧起大力神杯?我们拭目以待!买定离手!于此同时&#xf…