我正在研究一个迁移项目,以从Oracle转移到EDB Postgres(包括更改通过JDBC进行DB调用的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中的问题与列别名模板有关,如果我更改别名以说模板1,模板似乎是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
尽管我们对上面列出的每个问题都有特定的解决方案,但根据从甲骨文到Postgres的经验来处理Java的此类差异的建议/建议将是有帮助的。我们希望转到适用于Postgres和Oracle(理想情况下!(的Java代码,并希望避免使用IF-Else代码来调用Oracle vs Postgres特定的SQL。
我为名称找到的一种可能的解决方案,模板关键字错误是引用列别名,这样,Postgres不将名称视为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