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;
执行结果