我正在开发一个迁移项目,从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。
答案 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