应用程序语法介绍
 
                  更新时间 2025-02-05 09:37:10
                 
 
                    最近更新时间: 2025-02-05 09:37:10
                  
 您可以通过本页了解天翼云TeleDB数据库的建立函数语法、[OR REPLACE] 更新函数介绍、[模式名.]函数名介绍。
 建立函数语法
CREATE [OR REPLACE] FUNCTION [模式名.]函数名 ([参数模式 [参数名] 数据类型 [default 默认值] [,…]]) RETRUNS [SETOF] 数据类型 AS
[标签]
[DECLARE
    --变量定义]
BEGIN
    --注释
    /*注释*/
    --语句执行
END;
[标签]
LANGUAGE PLPGSQL;
[OR REPLACE] 更新函数介绍
OR REPLACE 的作用为函数存在时则替换,建立 PL/pgsql 函数时如果不带 OR REPLACE 关键字, 则遇到函数已经存在,系统会报错,如下所示:
teledb=# select prosrc from pg_proc where proname='f';
             prosrc           
--------------------------------
                               +
 BEGIN                         +
 RAISE NOTICE 'Hello ,teledb';+
 END;                          +
  
(1 row)
teledb=# CREATE FUNCTION f() RETURNS VOID AS
$$
BEGIN
RAISE NOTICE 'Hello ,teledb';
END;
 $$
LANGUAGE PLPGSQL;
ERROR:  function "f" already exists with same argument types
teledb=# CREATE OR REPLACE FUNCTION f() RETURNS VOID AS
$$
BEGIN
RAISE NOTICE 'Hello ,teledb';
END;
 $$
LANGUAGE PLPGSQL;
CREATE FUNCTION
teledb=# select prosrc from pg_proc where proname='f';
             prosrc           
--------------------------------
                               +
 BEGIN                         +
 RAISE NOTICE 'Hello ,teledb';+
 END;                          +
  
(1 row)
teledb=# select f();
NOTICE:  Hello ,teledb
 f 
---
 
(1 row)
[模式名.]函数名介绍
建立函数名称,模式名可以指定,也可以不指定,不指存则存放在当前模式下,如上面例子就没有指定模式名,则就存放在当前模式下,如下所示:
teledb=# select * from pg_namespace;
      nspname       | nspowner |              nspacl            
--------------------+----------+----------------------------------
 pg_toast           |       10 | 
 pg_oracle          |       10 | 
 squeeze            |       10 | 
 pg_temp_1          |       10 | 
 pg_toast_temp_1    |       10 | 
 pg_catalog         |       10 | {teledb=UC/teledb,=U/teledb}
 public             |       10 | {teledb=UC/teledb,=UC/teledb}
 information_schema |       10 | {teledb=UC/teledb,=U/teledb}
(8 rows)
teledb=# show search_path;
   search_path   
-----------------
 "$user", public
(1 row)
teledb=# select pg_namespace.nspname,pg_proc.prosrc from pg_proc,pg_namespace where 
teledb-# pg_proc.pronamespace=pg_namespace.oid and pg_proc.proname='f';
 nspname |             prosrc           
---------+--------------------------------
 public  |                               +
         | BEGIN                         +
         | RAISE NOTICE 'Hello ,teledb';+
         | END;                          +
         |  
(1 row)
因为$user模式不存在,所以存在public模式下。
