2014-12-29 229 views
0

我有這樣的功能:傳遞表名作爲參數傳遞給一個函數創建一個表

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 

請讓我知道這個錯誤的含義以及如何解決它? 感謝

+0

你的函數返回void,所以你無法從結果中選擇。另外,我不確定postgresql,但至少有一個其他數據庫引擎,ms sql,函數不允許寫入數據庫。他們只能返回數據。 –

回答

1

the documentation for format

  • I treats the argument value as an SQL identifier, double-quoting it if necessary.
  • L quotes the argument value as an SQL literal.

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

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

(聲明:我沒有PostgreSQL實例方便與測試,所以可能仍然存在一些問題,你糾正%L%I後)

相關問題