PostgreSQL的存储过程简单入门

前端之家收集整理的这篇文章主要介绍了PostgreSQL的存储过程简单入门前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_404_0@转载自:http://blog.sina.com.cn/s/blog_6137d9b70102v5qd.html
  1. Postgresql 存储过程定义格式如下:
    ■结构 PL/pgsql是一种块结构的语言,比较方便的是用pgAdmin III新建Function,填入一些参数就可以了。
    基本上是这样的:
    CREATE OR REPLACE FUNCTION 函数名(参数1,[整型 int4,整型数组 _int4,...]) RETURNS 返回值类型 AS $BODY$ DECLARE 变量声明 BEGIN 函数 END; $BODY$ LANGUAGE plpgsql VOLATILE;
    ■变量类型 除了postgresql内置的变量类型外,常用的还有 RECORD ,表示一条记录。
    ■赋值 赋值和Pascal有点像:“变量 := 表达式;” 有些奇怪的是连接字符串的是“||”,比如 sql := SELECT * FROM || table || WHERE …’;
    ■判断 判断又和VB有些像: IF 条件 THEN ELSEIF 条件 THEN ELSE END IF;
    ■循环 循环有好几种写法: WHILE expression LOOP statements END LOOP; 还有常用的一种是:(从1循环到9可以写成FOR i IN 1..9 LOOP FOR name IN [ REVERSE ] expression .. expression LOOP statements END LOOP;
    ■其他 还有几个常用的函数 SELECT INTO record …; 表示将select的结果赋给record变量(RECORD类型) PERFORM query; 表示执行query并丢弃结果 EXECUTE sql; 表示执行sql语句,这条可以动态执行sql语句(特别是由参数传入构造sql语句的时候特别有用)
    --简单的例子:
    1:无返回值
    CREATE OR REPLACE FUNCTION 函数名称( 参数1,参数2,...) RETURNS void
    AS
    $BODY$
    DECLARE --定义
    BEGIN
    INSERT INTO "表名" VALUES(参数1,参数2,...);
    END
    LANGUAGE 'plpgsql' VOLATILE; -- 最后别忘了这个。
    2:有返回值
    CREATE OR REPLACE FUNCTION 函数名称(deptcode VARCHAR(20),deptname VARCHAR(60),pycode VARCHAR(60),isenabled CHAR(1))
    RETURNS BOOLEAN --返回值,布尔类型
    $body$
    DECLARE
    deptcode VARCHAR(20);
    deptname VARCHAR(60);
    pycode VARCHAR(60);
    isenabled CHAR(1);
    UPDATE "deptDict" SET deptcode=deptcode,deptname=deptname,pycode=pycode,isenabled=isenabled,updatedhisdatetime=CURRENT_TIMESTAMP
    WHERE deptcode=deptcode;
    RETURN TRUE;
    $body$
    LANGUAGE 'plpgsql' VOLATILE;
    最后再加上如何执行这个存储过程(函数
    -- 执行存储过程方法1
    SELECT * FROM 函数名称(参数1,参数2,...)
    -- 执行存储过程方法2
    SELECT 函数名称('0参数1,参数2,...)
  1. 1、创建一个存储过程Postgresql 好像没有专门的 CREATE OR REPLACE PROCEDURE 全部都是 FUNCTION 的样子。
    对于没有返回值的。 可以通过 RETURNS void来实现。

    2、要更新一个现有函数的定义,使用 CREATE OR REPLACE FUNCTION
    3、我们不能用这个方法修改一个函数的名字或者参数类型(如果你这么干,那么你就会创建一个新的,不同的函数)。
    同样,CREATE OR REPLACE FUNCTION 也不会允许你修改一个现有函数的返回类型。
    要做这些事情,你必须删除并重新创建函数
    (如果使用 OUT 参数,那就意味着除了删除函数,你不能修改任何 OUT 参数的类型或者名字。)
    如果你删除然后重建一个函数,新函数和旧的将是不同的实体;你就需要删除现有引用了老函数的规则,视图,触发器等等。
    4、使用 CREATE OR REPLACE FUNCTION 可以在不破坏引用该函数的对象的前提下修改函数定义。
    5、举例:好像没有 print 之类的语句。只好把结果写入临时表
    CREATE TABLE test_helloworld(
    datavarchar(30)
    );
    请注意,定义存储过程内使用的变量,需要定义在 BEGIN 之前, 需要加 DECLARE 关键字。
    多个变量之间用分号分隔。
    CREATE OR REPLACE FUNCTION HelloWorld() RETURNS void AS
    $$
    DECLARE
    testvalue1VARCHAR(20);
    testvalue2BEGIN
    testvalue1 := 'First Test! ';
    SELECT 'Second Test !' INTO testvalue2;
    INSERT INTO test_helloworld
    SELECT 'Hello World' ;
    INSERT INTO test_helloworld (data)
    VALUES (testvalue1 || testvalue2);
    END;
    LANGUAGE plpgsql;
    ---
    # SELECT HelloWorld();
    helloworld
    ------------
    (1 行记录)

    # select * from test_helloworld;
    ---------------------------
    Hello World
    First Test! Second Test !
    (2 行记录)
    修改存储过程
    要更新一个现有函数的定义,使用 CREATE OR REPLACE FUNCTION我们不能用这个方法修改一个函数的名字或者参数类型(如果你这么干,那么你就会创建一个新的,不同的函数)。
    同样,CREATE OR REPLACE FUNCTION 也不会允许你修改一个现有函数的返回类型。如果你删除然后重建一个函数,新函数和旧的将是不同的实体;你就需要删除现有引用了老函数的规则,视图,触发器等等。使用 CREATE OR REPLACE FUNCTION 可以在不破坏引用该函数的对象的前提下修改函数定义。
    具体代码略. 需要注意的一点。 删除函数的时候, 需要传递完整的参数列表, 仅仅指定一个函数名称 是无法删除的。
    例如:
    # drop FUNCTION HelloWorld;
    错误:语法错误 ";" 或附近的 1drop FUNCTION HelloWorld;# drop FUNCTION HelloWorld();
    DROP FUNCTION
    #
    参数定义 单个参数
    # truncate table test_helloworld;
    TRUNCATE TABLE
    # CREATE OR REPLACE FUNCTION HelloWorld1(vUserName VARCHAR) RETURNS void AS
    VALUES('Hello ' || vUserName);
    # SELECT HelloWorld1('ABC');-------------
    # select * from test_helloworld;-----------Hello ABC (1 行记录)
    函数参数的别名
    请注意这里:定义参数的时候, 没有定义参数名称 仅仅定义了参数的数据类型
    然后在定义变量的位置,通过vUserName ALIAS FOR $1来为 第一个参数, 指定一个变量名称
    叫做vUserName
    # CREATE OR REPLACE FUNCTION HelloWorld2 (varchar) RETURNS void AS
    vUserName ALIAS FOR $1;
    # SELECT HelloWorld2('XYZ');#select * from test_helloworld;
    Hello XYZ (1 行记录)
    某些情况下, 希望定义参数的时候, 数据类型,与某个表中的某一列的数据类型一样。
    这样,将来万一业务变化, 表的数据类型变化了,不需要修改存储过程代码
    定义的方式,是表名.列名%TYPE
    #CREATE TABLE test_type (
    test_IDINT,
    test_namevarchar(20)
    # CREATE OR REPLACE FUNCTION HelloWorld20 (
    p_user_nametest_type.test_name%TYPE
    ) RETURNS void AS
    INSERT INTO test_type VALUES(1,p_user_name);
    注意:类型关联 test_type.test_name%TYPE 转换为 character varying
    # select HelloWorld20('Test');
    helloworld20
    --------------
    # select * from test_type;
    test_id | test_name
    ---------+-----------
    1 | Test
    参数定义- INOUTIN OUT
    # CREATE OR REPLACE FUNCTION HelloWorld3 (
    IN vUserName VARCHAR,238)">OUT vOutValue VARCHAR
    ) AS
    vOutValue := 'A';
    # SELECT HelloWorld3('ABC');
    helloworld3
    A
    Test=# select * from test_helloworld;
    data
    -----------
    Hello ABC
    参数的默认值
    Postgresql不直接支持 参数的默认值。
    但是支持 重载。
    # TRUNCATE TABLE test_helloworld;
    # CREATE OR REPLACE FUNCTION HelloWorld3(
    p_user_name VARCHAR,238)">p_val1 VARCHAR,238)">p_val2 VARCHAR) RETURNS void AS
    VALUES (p_user_name || p_val1 || p_val2);
    p_val1 VARCHAR) RETURNS void AS
    PERFORM HelloWorld3(p_user_name,p_val1,' XYZ');
    p_user_name VARCHAR) RETURNS void AS
    ABC OPQXYZ
    返回结果集
    简单查询函数
    请注意:
    这里最后写的是LANGUAGE sql;不是因为函数里面, 没有任何逻辑, 只有一条 sql 语句.
    CREATE OR REPLACE FUNCTION GetTestMain (int)RETURNS test_main AS
    SELECT * FROM test_main WHERE id = $1;
    LANGUAGE sql;
    Test=# SELECT * FROM GetTestMain(1) AS t;
    id | value
    ----+-------
    1 | ONE
    # CREATE OR REPLACE FUNCTION GetTestMain (int)SELECT * FROM test_main WHERE id != $1;
    $$ LANGUAGE sql;
    # SELECT * FROM GetTestMain(0) AS t;
    2 | TWO
    请注意: 上面这种写法, 如果查询返回多行数据的情况下,这个函数仅仅会返回第一行。
    # CREATE OR REPLACE FUNCTION GetTestMain2(int) RETURNS setof test_main AS $$
    # SELECT * FROM GetTestMain2(1) AS t;
    4 | FOUR
    通过定义RETURNS setof ... 使得函数能过返回多行记录.
    假如业务逻辑比较复杂,无法简单 sql 处理的情况下
    需要使用 RETURN NEXT ... 来把当前行数据,加入结果集.
    使用 RETURN; 把整个结果集返回.
    # CREATE OR REPLACE FUNCTION GetTestMain3(int)
    RETURNS SETOF test_main AS
    v_test_main_data test_main%ROWTYPE;
    FOR v_test_main_data IN SELECT * FROM test_main LOOP
    IF v_test_main_data.id = $1 THEN
    -- 模拟一点逻辑操作.
    CONTINUE;
    END IF;
    -- 把当前行数据,加入结果集.
    RETURN NEXT v_test_main_data;
    END LOOP;
    -- 把整个结果集返回.
    RETURN;
    $$ LANGUAGE plpgsql;
    # SELECT * FROM GetTestMain3(1) AS t;
    普通返回的函数
    # CREATE OR REPLACE FUNCTION HelloWorld4() RETURNS varchar AS
    RETURN 'Hello World!';
    # select HelloWorld4();
    helloworld4
    Hello World!
    (1 行记录)

猜你在找的Postgre SQL相关文章