我在postgres
中有一个带有临时表的函数。
create or replace function sp_test_function()
returns table (id integer,enqu_id integer) as
$BODY$
BEGIN
create temporary table temp_table(
id serial,
enquiry_id integer
) on commit drop;
insert into temp_table(enquiry_id) select enquiry_id from sales_enquiry;
return query select t.id,enquiry_id from temp_table t;
END;
$BODY$
language plpgsql;
我在
jasper
中有一个报告,使用上面的函数获取数据。当我从服务器运行报告时遇到的问题得到这个错误cannot execute CREATE TABLE in a read-only transaction
。我试过SET TRANSACTION READ WRITE
$BODY$
BEGIN
SET TRANSACTION READ WRITE
create temporary table temp_table(
id serial,
enquiry_id integer
) on commit drop
但又有一个错误。如何在postgres函数中设置事务?
最佳答案
我终于找到了答案。
步骤1:打开context.xml
文件(C:\Jaspersoft\jasperreports-server-cp-5.5.0\apache-tomcat\webapps\jasperserver\META-INF\context.xml
)
在该文件中添加以下代码(我正在使用postgresql
db)
<Resource name="jdbc/your_db_name" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
username="db_username" password="db_password"
driverClassName="org.postgresql.Driver"
validationQuery="SELECT 1"
testOnBorrow="true"
url="jdbc:postgresql://127.0.0.1:5432/ur_db_name?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&autoReconnectForPools=true" factory="com.jaspersoft.jasperserver.tomcat.jndi.JSBasicDataSourceFactory"/>
步骤:2打开
web.xml
(C:\Jaspersoft\jasperreports-server-cp-5.5.0\apache-tomcat\webapps\jasperserver\WEB-INF\web.xml
)添加以下代码
<resource-ref>
<description>some_description</description>
<res-ref-name>jdbc/ur_db_name</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
步骤3:重新启动
jasperserver
步骤4:登录
jasper server
并添加new datasource
。从下拉列表中选择JNDI Data Source
,而不是JDBC Data Source
。在文本框字段
Service Name (required):
中键入jdbc/ur_db_name
。然后单击Test Connection
您将在顶部显示一条弹出消息。现在你可以在报告中使用这个Connection Passed
。希望这会有帮助。关于postgresql - 临时表创建在jasperserver中不起作用(无法在只读事务中执行CREATE TABLE),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42903118/