變量使用實例
更新時間 2025-02-14 10:25:04
最近更新時間: 2025-02-14 10:25: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)