PostgreSQL 存储过程 常用语法(高级)PERFORM DIAGNOSTICS RETURN

1.执行无结果调用

语法
PERFORM query;
通常被用来判断是否有记录,如下:
CREATE OR REPLACE FUNCTION public.test_perform()
    RETURNS void AS $BODY$
DECLARE
BEGIN
    PERFORM 1 from public.pgbench_branches where bid=14 limit 1;
    if found then
        raise notice 'found';
    else  
        raise notice 'not found';
    end if;
END
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
用于存储过程
PERFORM 1 from public.update_proc();
执行结果
 
 

2.结果存入变量

将结果存入变量时,如果没有结果被存入,或者存入的结果超过1条,可以这样来判断
语法
SELECT select_expressions INTO [STRICT] target FROM ...;
INSERT ... RETURNING expressions INTO [STRICT] target;
UPDATE ... RETURNING expressions INTO [STRICT] target;
DELETE ... RETURNING expressions INTO [STRICT] target;
例子
CREATE OR REPLACE FUNCTION public.test_into(inout bid_value integer)
    RETURNS integer AS $BODY$
DECLARE
    myrec record;
BEGIN
    SELECT * INTO myrec FROM public.pgbench_branches where bid=bid_value;
    IF NOT FOUND THEN
        RAISE EXCEPTION 'pgbench_branches: % not found', bid_value;
    END IF;
END
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
执行结果
支持 NO_DATA_FOUND (no rows) or TOO_MANY_ROWS (more than one row)
CREATE OR REPLACE FUNCTION public.test_into2(inout bid_value integer)
    RETURNS integer AS $BODY$
DECLARE
    myrec record;
BEGIN
    SELECT * INTO STRICT myrec FROM public.pgbench_branches where bid=bid_value or bid=14;
    EXCEPTION  
        WHEN NO_DATA_FOUND THEN  
            RAISE EXCEPTION 'pgbench_branches: % not found', bid_value;  
        WHEN TOO_MANY_ROWS THEN  
            RAISE EXCEPTION 'pgbench_branches: % not unique', bid_value;
END
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
执行结果
 

3.获取上一条sql的执行状态

语法
GET [ CURRENT ] DIAGNOSTICS variable { = | := } item [ , ... ];
例子
CREATE OR REPLACE FUNCTION public.test_get(inout bid_value integer)
    RETURNS integer AS $BODY$
DECLARE
    --myrec integer;
    integer_var integer;
BEGIN
    EXECUTE 'SELECT * FROM public.pgbench_branches WHERE bid='||bid_value||' or bid=14';
    GET DIAGNOSTICS integer_var = ROW_COUNT;
    raise notice 'integer_var:%',integer_var;
END
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
执行结果
支持的变量

4.NULL忽略执行

语法
BEGIN
    y := x / 0;
EXCEPTION
    WHEN division_by_zero THEN
        NULL;  -- ignore the error
END;
 
BEGIN
    y := x / 0;
EXCEPTION
    WHEN division_by_zero THEN  -- ignore the error
END;
 

5.返回多行(returns setof)

语法
RETURN NEXT expression;
RETURN QUERY query;
RETURN QUERY EXECUTE command-string [ USING expression [, ... ] ];
例子
# 创建表和插入数据
CREATE TABLE foo (fooid INT, foosubid INT, fooname TEXT);
INSERT INTO foo VALUES (1, 2, 'three');
INSERT INTO foo VALUES (4, 5, 'six');

CREATE OR REPLACE FUNCTION get_all_foo() RETURNS SETOF foo AS
$BODY$
DECLARE
    r foo%rowtype;
BEGIN
    FOR r IN
        SELECT * FROM foo WHERE fooid > 0
    LOOP
        -- can do some processing here
        RETURN NEXT r; -- return current row of SELECT
    END LOOP;
    RETURN;
END
$BODY$
LANGUAGE plpgsql;
执行结果
 

猜你喜欢

转载自blog.csdn.net/qq_35260875/article/details/106084148
今日推荐