2012-05-05 65 views
5

我試圖在Play2.0數據庫進化腳本中創建PostgreSQL觸發器。 SQL代碼是比較容易和pgAdminIII運行良好:使用JDBC創建PostgreSQL觸發器

CREATE OR REPLACE FUNCTION update_modified() RETURNS TRIGGER AS $$ 
    BEGIN 
    NEW.modified = now(); 
    RETURN NEW; 
    END; 
$$ LANGUAGE 'plpgsql'; 

然而,在運行時的演變,我得到一個錯誤:ERROR: unterminated dollar-quoted string at or near "$$ BEGIN NEW.modified = now()"。 SQL代碼似乎在 處被截斷,在函數中遇到第一個分號。我正在使用PostgreSQL的「9.1-901.jdbc4」JDBC驅動程序。

更新:

Evolutions.scala的代碼(線219+)執行對;簡單分裂。似乎在框架本身是錯誤的:

// Execute script 
s.sql.split(";").map(_.trim).foreach { 
    case "" => 
    case statement => execute(statement) 
} 

任何解決方案?

+0

這個問題已經在這裏討論過了(http://archives.postgresql.org/pgsql-jdbc/2010-03/msg00056.php)。 – fynn

+0

請向我們展示創建觸發器的Java代碼。 –

+0

創建觸發器的代碼不是我自己的,因爲sql腳本是[Play數據庫進化腳本](http://www.playframework.org/documentation/2.0/Evolutions)。我猜(斯卡拉!)代碼可以在這裏找到[https://github.com/playframework/Play20/blob/master/framework/src/play/src/main/scala/play/api/db/evolutions /Evolutions.scala)。 – fynn

回答

2

您可以嘗試以下事情。

String sql = "CREATE OR REPLACE FUNCTION update_modified() RETURNS TRIGGER AS $$ " + 
      "BEGIN " + 
       "NEW.modified = now(); " + 
       "RETURN NEW; " + 
       "END; " + 
      "$$ LANGUAGE 'plpgsql';"; 
    DataSource ds = getDataSource(); 
    try { 
     Connection conn = ds.getConnection(); 
     conn.setAutoCommit(true); 
     Statement st = conn.createStatement(); 
     st.executeUpdate(sql); 
     st.close(); 
     conn.close(); 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 

希望這會對你有用。

+0

哪裏可以找到合適的代碼?它需要在評估演化之前執行。 Gloabal的onStart方法似乎是錯誤的地方... – fynn