变量使用介绍
在一个块中使用的所有变量必须在该块的声明小节中事先进行声明,PL/pgSQL 变量可以是任意 SQL 数据类型,可以是一个简单数据类型、复合类型、RECORD、已经存在的表行类型、表字段类型、游标。
变量使用实例
变量声明语法
name [ CONSTANT ] type [ COLLATE collation_name ] [ NOT NULL ] [ { DEFAULT | := | = } expression ];
如果给定 DEFAULT 子句,它会指定进入该块时分配给该变量的初始值。如果没有给出 DEFAULT 子句, 则该变量被初始化为 SQL 空值。
CONSTANT 选项阻止该变量在初始化之后被赋值, 这样它的值在块的持续期内保持不变。
COLLATE 选项指定用于该变量的一个排序规则(见 第 41.3.6 节)。如果指定了NOT NULL,对该变量赋值为空值会导致一个 运行时错误。所有被声明为 NOT NULL 的变量必须被指定一个非空默认值。 等号(=)可以被用来代替 PL/SQL-兼容的 :=。
定义一个普通变量
postgres=# CREATE OR REPLACE FUNCTION f25() RETURNS VOID ASpostgres-# $$postgres$# DECLAREpostgres$# --所有变量的声明都要放在这里,建议变量以v_开头,参数以a_开头postgres$# v_int integer := 1;postgres$# v_text text;postgres$# BEGINpostgres$# v_text = 'tdsql_pg';postgres$# RAISE NOTICE 'v_int = %',v_int;postgres$# RAISE NOTICE 'v_text = %',v_text;postgres$# END;postgres$# $$postgres-# LANGUAGE plpgsql;CREATE FUNCTIONpostgres=# SELECT f25();NOTICE: v_int = 1NOTICE: v_text = tdsql_pgf25-----(1 row)postgres=#
定义 CONSTANT 变量
postgres=# CREATE OR REPLACE FUNCTION f25() RETURNS VOID ASpostgres-# $$postgres$# DECLAREpostgres$# v_int CONSTANT integer := 1;postgres$# BEGINpostgres$# RAISE NOTICE 'v_int = %',v_int;postgres$# END;postgres$# $$postgres-# LANGUAGE plpgsql;CREATE FUNCTIONpostgres=# select f25();NOTICE: v_int = 1f25-----(1 row)
CONSTANT 不能再次赋值。
postgres=# CREATE OR REPLACE FUNCTION f25() RETURNS VOID ASpostgres-# $$postgres$# DECLAREpostgres$# v_int CONSTANT integer := 1;postgres$# BEGINpostgres$# RAISE NOTICE 'v_int = %',v_int;postgres$# v_int = 10;postgres$# RAISE NOTICE 'v_int = %',v_int;postgres$# END;postgres$# $$postgres-# LANGUAGE plpgsql;ERROR: "v_int" is declared CONSTANT
定义 NOT NULL 变量
postgres=# CREATE OR REPLACE FUNCTION f25() RETURNS VOID ASpostgres-# $$postgres$# DECLAREpostgres$# v_int integer NOT NULL := 1;postgres$# BEGINpostgres$# RAISE NOTICE 'v_int = %',v_int;postgres$# SELECT NULL INTO v_int;postgres$# RAISE NOTICE 'v_int = %',v_int;postgres$# END;postgres$# $$postgres-# LANGUAGE plpgsql;CREATE FUNCTIONpostgres=# SELECT f25();NOTICE: v_int = 1ERROR: null value cannot be assigned to variable "v_int" declared NOT NULLCONTEXT: PL/pgSQL function f25() line 6 at SQL statementpostgres=#
定义为 NOT NULL 变量,则该变量受 NOT NULL 约束。
定义 COLLATE 变量
按 unicode 值对比大小。
postgres=# CREATE OR REPLACE FUNCTION f25() RETURNS VOID ASpostgres-# $$postgres$# DECLAREpostgres$# v_txt1 TEXT COLLATE "C" := '严';postgres$# v_txt2 TEXT COLLATE "C" := '丰';postgres$# BEGINpostgres$# IF v_txt1 > v_txt2 THENpostgres$# RAISE NOTICE ' % -> % ',v_txt1,v_txt2;postgres$# ELSEpostgres$# RAISE NOTICE ' % -> % ',v_txt2,v_txt1;postgres$# END IF;postgres$# END;postgres$# $$postgres-# LANGUAGE plpgsql;CREATE FUNCTIONpostgres=# SELECT f25();NOTICE: 丰 -> 严f25-----(1 row)postgres=# select '严'::bytea;bytea----------\\xe4b8a5(1 row)postgres=# select '丰'::bytea;bytea----------\\xe4b8b0(1 row)
按汉字的拼音对比大小。
postgres=# CREATE OR REPLACE FUNCTION f25() RETURNS VOID ASpostgres-# $$postgres$# DECLAREpostgres$# v_txt1 TEXT COLLATE "zh_CN.utf8" := '严';postgres$# v_txt2 TEXT COLLATE "zh_CN.utf8" := '丰';postgres$# BEGINpostgres$# IF v_txt1 > v_txt2 THENpostgres$# RAISE NOTICE ' % -> % ',v_txt1,v_txt2;postgres$# ELSEpostgres$# RAISE NOTICE ' % -> % ',v_txt2,v_txt1;postgres$# END IF;postgres$# END;postgres$# $$postgres-# LANGUAGE plpgsql;CREATE FUNCTIONpostgres=# SELECT f25();NOTICE: 严 -> 丰f25-----(1 row)
变量赋值
postgres=# CREATE OR REPLACE FUNCTION f25() RETURNS VOID ASpostgres-# $$postgres$# DECLAREpostgres$# --定义时赋值postgres$# v_int1 integer = 1;postgres$# --使用 :=兼容于plsqlpostgres$# v_int2 integer := 1;postgres$# v_txt1 text;postgres$# v_float float8;postgres$# --使用查询赋值postgres$# v_relname text = (select relname FROM pg_class LIMIT 1);postgres$# v_relpages integer;postgres$# v_rec RECORD;postgres$# BEGINpostgres$# --在函数体中赋值postgres$# v_txt1 = 'tdsql_pg';postgres$# v_float = random();postgres$# --使用查询赋值的另一种方式postgres$# SELECT relname,relpages INTO v_relname,v_relpages FROM pg_class ORDER BY random() LIMIT 1;postgres$# RAISE NOTICE 'v_relname = % , relpages = %',v_relname,v_relpages;postgres$# END;postgres$# $$postgres-# LANGUAGE plpgsql;CREATE FUNCTIONpostgres=# SELECT * FROM f25();NOTICE: v_relname = pg_ts_parser , relpages = 1f25-----(1 row)