Postgres SQL存储函数参数使用说明

在使用postgres数据库的过程中,遇到了表分区的问题。为了创建表分区,首先得创建分区表。首先想到的是写个存储函数,然后定时的创建分区表,然后再创建触发器去操作分区表。但是在创建存储函数时,怎么把分区表的表名当作参数传进存储函数,然后在函数内部动态创建表。可是直接使用字符串的表名不起作用。经研究,需要使用EXECUTE去执行,具体做法为:拼接一个创建表的sql语句,然后用EXECUTE 执行sql语句,这样创建表就完成了。详细代码如下:

CREATE OR REPLACE FUNCTION "public"."pro_partition_play_recond"(tablename varchar)
  RETURNS "pg_catalog"."void" AS $BODY$Declare  
    sqlstring varchar(1024); 
		start_date varchar DEFAULT '2017-08-01';
		end_date varchar DEFAULT '2017-09-01';
		index_str varchar ;
BEGIN
		sqlstring:= 'create table '|| tablename ||'(check(create_date >= ''' || start_date || '''  AND create_date < ''' || end_date || ''')) INHERITS (md_play_recode);';
    EXECUTE sqlstring;
		index_str=tablename || '_create_date';
		raise notice 'Parameter  is: %', index_str ;	
		sqlstring:='create index '||index_str||' on '|| tablename ||' (create_date);';
		EXECUTE sqlstring;
	 
END
$BODY$
  LANGUAGE 'plpgsql' VOLATILE COST 100
;

ALTER FUNCTION "public"."pro_partition_play_recond"(tablename varchar) OWNER TO "postgres";

说明:表名参数tablename 在拼接sql语句时,应用用:'|| tablename ||',需要加引号时用这个''' || start_date || '''。这是3个单引号。
调用如下:

select pro_partition_play_recond('md_play_recode_201708');

效果如下:

Postgres SQL存储函数参数使用说明_第1张图片



代码如下:

CREATE OR REPLACE FUNCTION "public"."pro_partition_play_recond"(tablename varchar)
  RETURNS "pg_catalog"."void" AS $BODY$Declare  
    sqlstring varchar(1024); 
		start_date varchar DEFAULT '2017-08-01';
		end_date varchar DEFAULT '2017-09-01';
		index_str varchar ;
BEGIN
		sqlstring:= 'create table '|| tablename ||'(check(create_date >= ''' || start_date || '''   AND create_date < ''' || end_date || ''')) INHERITS (md_play_recode);';
    EXECUTE sqlstring;
		index_str=tablename || '_create_date';
		raise notice 'Parameter  is: %', index_str ;	
		sqlstring:='create index '||index_str||' on '|| tablename ||' (create_date);';
		EXECUTE sqlstring;
	 
END
$BODY$
  LANGUAGE 'plpgsql' VOLATILE COST 100
;


你可能感兴趣的:(数据库)