变量使用实例
 
                  更新时间 2025-02-14 10:22:04
                 
 
                    最近更新时间: 2025-02-14 10:22:04
                  
 本页介绍天翼云TeleDB数据库PL/pgsql函数的变量使用实例。
 变量声明语法
name [ CONSTANT ] type [ COLLATE collation_name ] [ NOT NULL ] [ { DEFAULT | := | = } expression ];如果给定DEFAULT子句,它会指定进入该块时分配给该变量的初始值。如果没有给出DEFAULT子句, 则该变量被初始化为SQL空值。 CONSTANT选项阻止该变量在初始化之后被赋值, 这样它的值在块的持续期内保持不变。 COLLATE选项指定用于该变量的一个排序规则(见 第 41.3.6 节)。如果指定了NOT NULL,对该变量赋值为空值会导致一个运行时错误。所有被声明为NOT NULL的变量必须被指定一个非空默认值。 等号(=)可以被用来代替PL/SQL-兼容的 :=。
定义一个普通变量
teledb=# CREATE OR REPLACE FUNCTION f25() RETURNS VOID AS
teledb-# $$
teledb$# DECLARE
teledb$#     --所有变量的声明都要放在这里,建议变量以v_开头,参数以a_开头
teledb$#     v_int integer := 1;
teledb$#     v_text text;    
teledb$# BEGIN
teledb$#     v_text = 'teledb_pg';
teledb$#     RAISE NOTICE 'v_int = %',v_int;  
teledb$#     RAISE NOTICE 'v_text = %',v_text;  
teledb$# END;
teledb$# $$
teledb-# LANGUAGE plpgsql;
CREATE FUNCTION
teledb=# SELECT f25();
NOTICE:  v_int = 1
NOTICE:  v_text = teledb_pg
 f25 
-----
(1 row)
teledb=#定义CONSTANT 变量
teledb=# CREATE OR REPLACE FUNCTION f25() RETURNS VOID AS
teledb-# $$
teledb$# DECLARE    
teledb$#     v_int CONSTANT integer := 1;     
teledb$# BEGIN
teledb$#     RAISE NOTICE 'v_int = %',v_int;  
teledb$# END;
teledb$# $$
teledb-# LANGUAGE plpgsql;
CREATE FUNCTION
teledb=# select f25();
NOTICE:  v_int = 1
 f25 
-----
(1 row)CONSTANT不能再次赋值。
teledb=# CREATE OR REPLACE FUNCTION f25() RETURNS VOID AS
teledb-# $$
teledb$# DECLARE    
teledb$#     v_int CONSTANT integer := 1;     
teledb$# BEGIN
teledb$#     RAISE NOTICE 'v_int = %',v_int;  
teledb$#     v_int = 10;
teledb$#     RAISE NOTICE 'v_int = %',v_int;       
teledb$# END;
teledb$# $$
teledb-# LANGUAGE plpgsql;
ERROR:  "v_int" is declared CONSTANT定义NOT NULL 变量
teledb=# CREATE OR REPLACE FUNCTION f25() RETURNS VOID AS
teledb-# $$
teledb$# DECLARE    
teledb$#     v_int integer NOT NULL := 1;     
teledb$# BEGIN
teledb$#     RAISE NOTICE 'v_int = %',v_int;  
teledb$#     SELECT NULL INTO v_int;
teledb$#     RAISE NOTICE 'v_int = %',v_int;  
teledb$# END;
teledb$# $$
teledb-# LANGUAGE plpgsql;
CREATE FUNCTION
teledb=# SELECT f25();   
NOTICE:  v_int = 1
ERROR:  null value cannot be assigned to variable "v_int" declared NOT NULL
CONTEXT:  PL/pgSQL function f25() line 6 at SQL statement
teledb=#定义为NOT NULL 变量,则该变量受 NOT NULL 约束。
定义COLLATE变量
按unicode 值对比大小。
teledb=# CREATE OR REPLACE FUNCTION f25() RETURNS VOID AS
teledb-#  $$
teledb$#  DECLARE    
teledb$#      v_txt1 TEXT COLLATE "C" := '天';     
teledb$#      v_txt2 TEXT COLLATE "C" := '翼';     
teledb$#  BEGIN
teledb$#      IF v_txt1 > v_txt2 THEN
teledb$#          RAISE NOTICE ' % -> % ',v_txt1,v_txt2;
teledb$#      ELSE
teledb$#          RAISE NOTICE ' % -> % ',v_txt2,v_txt1;
teledb$#      END IF; 
teledb$#  END;
teledb$#  $$
teledb-#  LANGUAGE plpgsql;
CREATE FUNCTION
teledb=# SELECT f25(); 
NOTICE:   翼 -> 天 
 f25 
-----
 
(1 row)
teledb=# select '天'::bytea;
  bytea   
----------
 \xe5a4a9
(1 row)
teledb=# select '翼'::bytea;
  bytea   
----------
 \xe7bfbc
(1 row)
teledb=#按汉字的拼音对比大小。
teledb=# CREATE OR REPLACE FUNCTION f25() RETURNS VOID AS
teledb-#  $$
teledb$#  DECLARE    
teledb$#      v_txt1 TEXT COLLATE "zh_CN.utf8" := '天';     
teledb$#      v_txt2 TEXT COLLATE "zh_CN.utf8" := '翼';     
teledb$#  BEGIN
teledb$#      IF v_txt1 > v_txt2 THEN
teledb$#          RAISE NOTICE ' % -> % ',v_txt1,v_txt2;
teledb$#      ELSE
teledb$#          RAISE NOTICE ' % -> % ',v_txt2,v_txt1;
teledb$#      END IF; 
teledb$#  END;
teledb$#  $$
teledb-#  LANGUAGE plpgsql;
CREATE FUNCTION
teledb=# SELECT f25();
NOTICE:   翼 -> 天 
 f25 
-----
(1 row)变量赋值
teledb=# CREATE OR REPLACE FUNCTION f25() RETURNS VOID AS
teledb-# $$
teledb$# DECLARE    
teledb$#     --定义时赋值
teledb$#     v_int1 integer = 1; 
teledb$#     --使用 :=兼容于plsql
teledb$#     v_int2 integer := 1; 
teledb$#     v_txt1 text;
teledb$#     v_float float8;
teledb$#     --使用查询赋值
teledb$#     v_relname text = (select relname FROM pg_class LIMIT 1);    
teledb$#     v_relpages integer;
teledb$#     v_rec RECORD;
teledb$# BEGIN           
teledb$#     --在函数体中赋值
teledb$#     v_txt1 = 'teledb_pg';    
teledb$#     v_float = random();
teledb$#     --使用查询赋值的另一种方式
teledb$#     SELECT relname,relpages INTO v_relname,v_relpages FROM  pg_class ORDER BY random() LIMIT 1;
teledb$#     RAISE NOTICE 'v_relname = % , relpages = %',v_relname,v_relpages;
teledb$# END;
teledb$# $$
teledb-# LANGUAGE plpgsql;
CREATE FUNCTION
teledb=# SELECT * FROM f25();
NOTICE:  v_relname = pg_ts_parser , relpages = 1
 f25 
-----
(1 row)