Postgresql自定义函数—表名作为函数参数

  • 函数传递表名和另外一个参数示例

CREATE OR REPLACE FUNCTION some_f(_tbl text, col text, OUT result bool)

LANGUAGE plpgsql AS

func

BEGIN

EXECUTE format('SELECT (EXISTS (SELECT FROM %s WHERE b = $1))', _tbl,col) using col INTO result;

END

func;

函数调用:

test=# select some_f('test','test'); --这里只传递了2个参数

some_f


t

(1 row)

使用using子句给format函数传递参数($1),这里是数字'壹'。%s的含义,见第四部分说明

  • 表名作为参数,返回表中记录数

CREATE OR REPLACE FUNCTION get_table_info(tablenames text)

RETURNS int AS $$

DECLARE

rowcount int;

BEGIN

EXECUTE format('SELECT count(*) FROM %I', tablenames) INTO rowcount;

return rowcount;

END

LANGUAGE plpgsql; 函数调用: test=# select get_table_info('test'); get_table_info ---------------- 2 (1 row) * 表名作为参数,返回表中记录值 CREATE OR REPLACE FUNCTION get_table_info(tablenames text) RETURNS table(a int,b varchar) AS

DECLARE

rowcount int;

BEGIN

return query EXECUTE format('SELECT * FROM %I', tablenames);

END

LANGUAGE plpgsql; 函数调用: test=# select get_table_info('test'); get_table_info ---------------- (10,test) (1,testtest) 这种调用方式,返回表的数据,作为元组形式 或者 test=# select \* from get_table_info('test'); a \| b ----+---------- 10 \| test 1 \| testtest (2 rows) 这种调用方式,返回表的数据同正常查询结果的返回 * 几个注意问题 1. Out参数,在调用时,不需要在调用时传递 2. 当需要返回table类型时,可以使用return query或者return next 3. Format函数参数的说明: %I is equivalent to quote_ident, and %L is equivalent to quote_nullable. The format function can be used in conjunction with the USING clause: EXECUTE format('UPDATE tbl SET %I = $1 WHERE key = $2', colname) USING newvalue, keyvalue;

相关推荐
【非典型Coder】42 分钟前
Statement和PreparedStatement区别
数据库
m0_736927042 小时前
想抓PostgreSQL里的慢SQL?pg_stat_statements基础黑匣子和pg_stat_monitor时间窗,谁能帮你更准揪出性能小偷?
java·数据库·sql·postgresql
lang201509282 小时前
MySQL 8.0.29 及以上版本中 SSL/TLS 会话复用(Session Reuse)
数据库·mysql
望获linux2 小时前
【实时Linux实战系列】使用 u-trace 或 a-trace 进行用户态应用剖析
java·linux·前端·网络·数据库·elasticsearch·操作系统
清和与九3 小时前
binLog、redoLog和undoLog的区别
数据库·oracle
望获linux3 小时前
【实时Linux实战系列】FPGA 与实时 Linux 的协同设计
大数据·linux·服务器·网络·数据库·fpga开发·操作系统
总有刁民想爱朕ha3 小时前
Python自动化从入门到实战(24)如何高效的备份mysql数据库,数据备份datadir目录直接复制可行吗?一篇给小白的完全指南
数据库·python·自动化·mysql数据库备份
朝九晚五ฺ3 小时前
【Redis学习】持久化机制(RDB/AOF)
数据库·redis·学习
虾说羊4 小时前
sql中连接方式
数据库·sql
liweiweili1264 小时前
Django中处理多数据库场景
数据库·python·django