2012-05-05 59 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