Oracle向EDB Postgres Java嵌入式SQL问题

时间:2017-06-01 12:45:24

标签: postgresql jdbc

我正在开发一个迁移项目,从Oracle迁移到EDB Postgres(包括更改通过JDBC进行数据库调用的Java代码,使其与Oracle和Postgres一起工作)。 EDB Postgres附带了一个内置的PL / Java层,可以将Oracle功能转换为Postgres中各自的等价物。但是,这并不适用于所有情况。

我们正在使用Oracle 11g和EDB Postgres 9.5

到目前为止,我们在postgres上面临的一些问题是:

org.postgresql.util.PSQLException: ERROR: date format not recognized (for format 'DD/MM/YYYY HH24:MI:SSxFF3)
org.postgresql.util.PSQLException: Bad value for type long (getClob and setClob don't work with postgres text columns)
org.postgresql.util.PSQLException: ERROR: syntax error at or near "NAME" (Any column alias named NAME fails during JDBC PreparedStatement execution)
org.postgresql.util.PSQLException: ERROR: syntax error at or near "TEMPLATE" (Any column alias named TEMPLATE fails during JDBC PreparedStatement execution)

编辑: Java代码很简单。下面的代码段包括Java调用和表格详细信息:

问题#1

create table table_name (TEMPLATE varchar2(10))

列数据类型:

Oracle
TEMPLATE varchar2(10)

的Postgres

TEMPLATE character varying (10) (Postgres table was created by the EDB postgres migration toolkit)

以下SQL中的问题是使用列别名TEMPLATE,如果我将别名更改为TEMPLATE1,则可以正常工作,TEMPLATE似乎是Postgres中的关键字。

sqlQuery = "SELECT A.TEMPLATE TEMPLATE FROM TABLE_NAME A";
preparedStatement = conn.prepareStatement(sqlQuery); 
resultSet = preparedStatement.executeQuery();
//Works in Oracle, ERROR in postgres: syntax error at or near "TEMPLATE"

问题#2

create table table_name1 (date_col TIMESTAMP(6))

列数据类型:

Oracle
Date_Col TIMESTAMP(6)

的Postgres

Date_Col timestamp without time zone (Postgres table was created by the EDB postgres migration toolkit)

sqlQuery = "Select TO_CHAR(DATE_COL,'DD/MM/YYYY HH24:MI:SSxFF3') from TABLE_NAME1";
preparedStatement = conn.prepareStatement(sqlQuery); 
resultSet = preparedStatement.executeQuery();
//Works in Oracle, ERROR in postgres: date format not recognized

虽然我们针对上面列出的每个问题都有具体的解决方案,但根据从Oracle迁移到Postgres的经验来处理Java差异的建议/建议将会有所帮助。我们希望转向适用于Postgres和Oracle的Java代码(理想情况下!),并希望避免if-else代码调用Oracle vs Postgres特定的SQL。

1 个答案:

答案 0 :(得分:1)

我发现NAME的一个可能的解决方案,TEMPLATE关键字错误是引用列别名,这样postgres不会将NAME,TEMPLATE视为关键字。

SELECT A.TEMPLATE TEMPLATE FROM TABLE_NAME A
org.postgresql.util.PSQLException: ERROR: syntax error at or near "TEMPLATE" (Any column alias named TEMPLATE fails during JDBC PreparedStatement execution)

将其更改为:

SELECT A.TEMPLATE "TEMPLATE" FROM TABLE_NAME A