PostgreSQL调用函数

PostgreSQL允许函数有命名参数,可以被位置名称表示法调用。名称表示法对有大量参数的函数特别有用,因为它更加明确和可靠的标记了形参和实参之间的联系。在位置表示法里,一个函数调用的参数值要用与函数声明相同的顺序来写出。在名称表示法里,参数是通过名称来与函数参数相匹配的,可以以任意顺序写出。

不管用那种表示法,在函数声明时给出的有默认值的参数在调用时不必写出。但是这在名称表示法中是特别有用的,因为参数的任意组合都是可以省略的。而在位置表示法中,参数只能从右到左省略。

PostgreSQL也支持混合表示法,混合表示法结合了位置和名称表示法。因为这个原因,先写位置参数然后跟着写命名参数。

下面的例子将说明三种表示法的用法,使用下面的函数定义:

CREATE FUNCTION concat_lower_or_upper(a text, b text, uppercase boolean DEFAULT false)
RETURNS text
AS
$$
 SELECT CASE
        WHEN $3 THEN UPPER($1 || ‘ ‘ || $2)
        ELSE LOWER($1 || ‘ ‘ || $2)
        END;
$$
LANGUAGE SQL IMMUTABLE STRICT;

函数concat_lower_or_upper有两个强制的参数,ab。此外第三个参数是一个可选参数uppercase,默认为falseab输入将被串联,并且将根据uppercase 参数强制为大写或者小写。

1. 使用位置表示法

在PostgreSQL中,位置表示法是传递参数到函数的传统机制。一个例子是:

SELECT concat_lower_or_upper(‘Hello‘, ‘World‘, true);
 concat_lower_or_upper
-----------------------
 HELLO WORLD
(1 row)

所有的参数都按顺序指定。因为uppercase被指定为true,所以结果为大写。另外一个例子是:

SELECT concat_lower_or_upper(‘Hello‘, ‘World‘);
 concat_lower_or_upper
-----------------------
 hello world
(1 row)

这里,省略了参数uppercase,所以接受它的默认值false,导致小写的输出。在位置表示法中,参数只要有默认值就可以从右到左省略。

2. 使用名称表示法

在名称表示法中,每个参数名字是使用:=声明的,用来将它从参数表达式中独立出来。例如:

SELECT concat_lower_or_upper(a := ‘Hello‘, b := ‘World‘);
 concat_lower_or_upper
-----------------------
 hello world
(1 row)

另外,参数uppercase是省略的,所以它被隐式的设置为false。使用名称表示法的好处之一是参数可以用任意顺序声明,例如:

SELECT concat_lower_or_upper(a := ‘Hello‘, b := ‘World‘, uppercase := true);
 concat_lower_or_upper
-----------------------
 HELLO WORLD
(1 row)

SELECT concat_lower_or_upper(a := ‘Hello‘, uppercase := true, b := ‘World‘);
 concat_lower_or_upper
-----------------------
 HELLO WORLD
(1 row)

3. 使用混合表示法

混合表示法结合了位置和名称表示法。然而,就像之前提到的,命名参数不可以在位置参数前面。例如:

SELECT concat_lower_or_upper(‘Hello‘, ‘World‘, uppercase := true);
 concat_lower_or_upper
-----------------------
 HELLO WORLD
(1 row)

在上面的查询中,参数auppercase是用位置声明的,而 uppercase是用名称声明的。在这个例子中,添加了文档中没有的一点。在一个有多个参数有默认值的更复杂的函数中,名称或者混合表示法可以节省很多敲键,并且可以减少犯错的几率。

注意: 在调用一个聚合函数时,目前不能使用名称和混合调用表示法(但是当聚合函数用作窗口函数时,它们确实能运行)。

更多知识尽在http://www.infocool.net

时间: 2024-08-02 10:42:43

PostgreSQL调用函数的相关文章

【原创】用第三方语言编写PostgreSQL 存储函数

在PostgreSQL里,所有的存储函数需求都可以用PLPGSQL来实现.同时也支持用第三方语言来编写,这个就得看自己哪个方面熟练了.不过要注意的一点是 PLPGSQL的效率怎么着都比其他第三方语言来的高效.比如,简单的插入表的存储函数: CREATE OR REPLACE FUNCTION ytt.insert_plpgsql(f_num integer) RETURNS void LANGUAGE plpgsql AS $ytt$ declare i int := 0; v_rank int

调用函数时传递的实参个数arguments.length; ,函数定义时的形参个数sum.length

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head> <title>范例6-4</title>

javascript学习笔记(二):定义函数、调用函数、参数、返回值、局部和全局变量

定义函数.调用函数.参数.返回值 关键字function定义函数,格式如下: function 函数名(){ 函数体 } 调用函数.参数.返回值的规则和c语言规则类似. 1 <!DOCTYPE html> 2 <html> 3 <head lang="en"> 4 <meta chaset="UTF-8"> 5 <title></title> 6 </head> 7 <body

Null作为参数的时候,Java编译器如何调用函数?

1 public class TestNull { 2 public void method(Object o){ 3 System.out.println("Object Version"); 4 } 5 6 public void method(String s){ 7 System.out.println("String Version"); 8 } 9 10 public static void main(String[] args) { 11 TestNu

调用函数的注意事项

在调用函数的时候一定要注意:1.实际参数的类型与形式参数的类型匹配. 2.实际参数与形式参数的个数要相同. 3.实际参数与形式参数的类型个数要一一对应. 我以注册与登录的程序为列来说明: package com.lovo.homework; import java.util.Scanner; public class Homework2016_11_22_1 { public static void main(String[] args) { String[] a=new String[3];

python学习日常-调用函数&amp;定义函数

这几天由于生病,所以停了下. 调用函数相当的简单,比其他许多语言简单多了.我们知道,python中有许多自带的方法,我们要用的时候,就直接“方法名(参数);"就可以调用了.比如调用类型转换方法将一个int类型转换为str类型就可以str(123):就好了 定义函数,一个函数简单的定义就是 关键字(def) 方法名(参数): 做什么: 比如定义一个a+b的方法 def Add(a,b): return a+b; 忘了说明,python函数一定有返回值,即return,你可以返回为none,但是还是

python获得线程调用函数的返回值

threading.Thread 并没有显式的提供获取线程调用函数返回值的方法,需求自己实现. 使用数据库是一个办法: 可以让子线程将数据写到数据库中,消费线程再去数据库中读取数据: 如果不想用数据库,可以使用类的全局变量来做传递, 示例代码如下: import os import threading class SubThread(): data = {} def __init__(self): ... def execute_func(self, key): # 执行各种操作 ... ret

通过函数实现打印*号组成的直角三角形,函数要求传入行数即可。在main 方法中,通过用户输入得到行数,然后调用函数做打印。

#include <stdio.h> /* 1.通过函数实现打印*号组成的直角三角形,函数要求传入行数即可.在main方法中,通过用户输入得到行数,然后调用函数做打印.三角形样式:********************* */ int sanjiao(int hang){ int i; int j; for(i = 0; i < hang;i++) { for(j = 0;j <i+1;j++) { printf("*"); } printf("\n

任意输入一个4位正整数,调用函数(函数自定义)输出该正整数数的各位数 字组成的最大数。

/*任意输入一个4位正整数,调用函数(函数自定义)输出该正整数数的各位数字组成的最大数.*/#include <stdio.h>int numb(int a){ int i = 0, j = 0,sum = 0, b[4]; b[0] = a%10; b[1] = a/10%10; b[2] = a/100%10; b[3] = a/1000; for (i = 0 ;i < 4; i++) { for(j = 0;j < 3 - i; j++) { if(b[j] > b[