postgresql存储过程

用了这么久的sql,从来没有写过存储过程,总是觉得它是个非常复杂并且高大上的技术来的,今天鼓足勇气尝试一下,然后就来了下边这个处女作,虽然是比较简单的,但是基本的格式还是有的,并且这个简单的存储过程中,出现了好多问题

1. 就是第一个 $body$ 这个地方注意,后边是没有分号的,结尾处的$$ 后边也是没有分号的哦  2. 两个$符号中间的那个body是可以省略掉的,但是要省略的话,注意开头和结尾都是需要省略掉的哦;

3. 结尾处的$$之后是没有分号的,并且后边紧接着要跟着  LANGUAGE plpgsql; 语句的;

4. 其次就是引号的嵌套问题,postgre sql 中,单引号的嵌套就直接写两个单引号就可以了,注意不能使用双引号作为内层的引号来使用的;

5. 默认创建的存储过程就是在当前的schema下边的,如果要创建在其他的schema下边的话,要在function name的前边添加schema的名称的,比如 shcema_aaa.my_function();

6. 注意赋值语句用的是 := ,而不是直接用等号哦;

7. 那写好了存储过程之后,怎么用呢? ---首先要运行一遍的存储过程,然后呢可以查询,类似   SELECT  *  FROM f_getlatestid(11168908);  ,如果创建function的时候带参数的,则调用的时候也是要传入参数的;

*******************************************************************************************不带参数版本的******************************************************************************************************

CREATE OR REPLACE FUNCTION car_service.f_getlatestid () RETURNS INTEGER AS $body$

DECLARE mysql TEXT;
DECLARE myid INTEGER;

BEGIN
mysql := 'SELECT id FROM car_service.service_reqs where id=''11168908''';
EXECUTE mysql INTO myid;
IF
myid IS NULL
OR myid = 0 THEN
RETURN 1;
ELSE RETURN myid + 1;
END IF;
END;
$body$ LANGUAGE plpgsql;

*************************************************************************带参数版本的**********************************************************

 

CREATE OR REPLACE FUNCTION f_getlatestid (myid integer) RETURNS INTEGER AS $body$

DECLARE mysql TEXT;
DECLARE finalid INTEGER;

BEGIN
mysql := 'SELECT id FROM car_service.service_reqs where id=$1';
EXECUTE mysql INTO finalid using myid ;
IF
finalid IS NULL
OR finalid = 0 THEN
RETURN 1;
ELSE RETURN finalid + 1;

END IF;

END;
$body$ LANGUAGE plpgsql;

SELECT
*
FROM
f_getlatestid(11168908);

posted on 2021-10-08 22:33  ClareBaby01  阅读(691)  评论(0编辑  收藏  举报