将表名作为参数传递给函数创建表

时间:2014-12-29 03:46:32

标签: sql postgresql

我有这个功能:

CREATE OR REPLACE FUNCTION create_table(tableName varchar)
  RETURNS void AS
$BODY$
BEGIN
   EXECUTE format('CREATE TABLE IF NOT EXISTS %L(
        link_id integer NOT NULL);',tableName);

END;
$BODY$
  LANGUAGE plpgsql VOLATILE;
ALTER FUNCTION create_table(varchar)
  OWNER TO postgres;

假设我执行这样的函数:

select * from create_table('me')

我收到此错误:

ERROR:  syntax error at or near "'me'"
LINE 1: CREATE TABLE IF NOT EXISTS 'me'(
                                   ^
QUERY:  CREATE TABLE IF NOT EXISTS 'me'(
        link_id integer NOT NULL);
CONTEXT:  PL/pgSQL function create_table(character varying) line 4 at EXECUTE statement

********** Error **********

ERROR: syntax error at or near "'me'"
SQL state: 42601
Context: PL/pgSQL function create_table(character varying) line 4 at EXECUTE statement

您能告诉我这个错误是什么意思以及如何解决吗? 感谢

1 个答案:

答案 0 :(得分:1)

来自the documentation for format

  
      
  • I将参数值视为SQL标识符,必要时对其进行双引号。
  •   
  • L将参数值引用为SQL文字。
  •   

你想要前者,而不是后者。所以:

   EXECUTE format('CREATE TABLE IF NOT EXISTS %I(
        link_id integer NOT NULL);',tableName);

(免责声明:我没有使用PostgreSQL实例进行测试,因此在您将%L更正为%I后仍可能存在其他一些问题。)