动态执行
teledb=# CREATE OR REPLACE FUNCTION f27(a_id INTEGER) RETURNS text AS
teledb-# $$
teledb$# DECLARE
teledb$# v_sql TEXT;
teledb$# v_mc TEXT;
teledb$# BEGIN
teledb$# v_sql := 'SELECT mc FROM t WHERE id='||a_id::TEXT;
teledb$# EXECUTE v_sql INTO v_mc;
teledb$# RETURN v_mc;
teledb$# END;
teledb$# $$
teledb-# LANGUAGE plpgsql;
CREATE FUNCTION
teledb=# SELECT f27(1);
f27
-------
teledb_pg
(1 row)
动态执行就是拼SQL语句,然后使用EXECUTE命令执行。
执行一个没有结果的命令
teledb=# CREATE OR REPLACE FUNCTION f27() RETURNS void AS
teledb-# $$
teledb$# BEGIN
teledb$# perform f27(1);
teledb$# END;
teledb$# $$
teledb-# LANGUAGE plpgsql;
CREATE FUNCTION
teledb=# SELECT f27();
f27
-----
(1 row)
teledb=#
获取执行结果
teledb=# DROP FUNCTION f27(INTEGER);
DROP FUNCTION
teledb=# CREATE OR REPLACE FUNCTION f27(a_id INTEGER) RETURNS VOID AS
teledb-# $$
teledb$# DECLARE
teledb$# v_mc TEXT;
teledb$# BEGIN
teledb$# SELECT mc INTO v_mc FROM t WHERE id=a_id;
teledb$# IF FOUND THEN
teledb$# RAISE NOTICE '查询到记录,值为%',v_mc;
teledb$# ELSE
teledb$# RAISE NOTICE '查不到记录' ;
teledb$# END IF;
teledb$# END;
teledb$# $$
teledb-# LANGUAGE plpgsql;
CREATE FUNCTION
teledb=# SELECT f27(1);
NOTICE: 查询到记录,值为Teledb
f27
-----
(1 row)
teledb=# SELECT f27(3);
NOTICE: 查不到记录
f27
-----
(1 row)
获取影响行数
teledb=# CREATE OR REPLACE FUNCTION f27(a_id INTEGER) RETURNS VOID AS
teledb-# $$
teledb$# DECLARE
teledb$# v_mc TEXT;
teledb$# v_row_count BIGINT;
teledb$# BEGIN
teledb$# SELECT mc INTO v_mc FROM t WHERE id=a_id;
teledb$# GET DIAGNOSTICS v_row_count = ROW_COUNT;
teledb$# RAISE NOTICE '查询到的记录数为 % ',v_row_count;
teledb$# END;
teledb$# $$
teledb-# LANGUAGE plpgsql;
CREATE FUNCTION
teledb=# SELECT f27(1);
NOTICE: 查询到的记录数为 1
f27
-----
(1 row)
teledb=# SELECT f27(3);
NOTICE: 查询到的记录数为 0
f27
-----
(1 row)