在 Java 上使用 Preparedstatement 在 Teradata 上插入 timestamp(0) 列
Inserting a timestamp(0) column on Teradata using Preparedstatement on Java
让我们假设以下 table:
CREATE MULTISET TABLE DATABASE.TABLE ,NO FALLBACK ,
NO BEFORE JOURNAL,
NO AFTER JOURNAL,
CHECKSUM = DEFAULT,
DEFAULT MERGEBLOCKRATIO
(
START_DATE TIMESTAMP(0) FORMAT 'DD-MMM-YYYYBHH:MI:SS',
STATUS DECIMAL(5,0) ,
PROCESS VARCHAR(100) CHARACTER SET LATIN CASESPECIFIC NOT NULL
)
PRIMARY INDEX ( PROCESS)
UNIQUE INDEX ( PROCESS, START_DATE );
我想做的是在 Java 上使用 PreparedStatement 插入 table,但它不起作用.. =/
这就是我在 Java 上所做的事情:
setConnection(); //IT IS OK, SO DONT WORRY!! =)
String insert = "insert into DATABASE.TABLE (START_DATE , STATUS, PROCESS)";
PreparedStatement pstm = getConnection().prepareStatement(insert);
ArrayList<Object> values = new ArrayList<Object>();
values.add(0, new java.sql.Timestamp(calendar.getTime().getTime()));
values.add(1, new Integer(0));
values.add(2, "TEST_PROCESS");
for (int i = 0; i < values.size(); i++)
{
if (values.get(i).getClass().equals(Integer.class))
pstm.setInt(i+1, (Integer) values.get(i));
if (values.get(i).getClass().equals(String.class))
pstm.setString(i+1, (String) values.get(i));
if (values.get(i).getClass().equals(Timestamp.class))
pstm.setTimestamp(i+1, (Timestamp) values.get(i));
if (values.get(i).getClass().equals(Date.class))
pstm.setDate(i+1, (Date) values.get(i));
if (values.get(i).getClass().equals(Double.class))
pstm.setDouble(i+1, (Double) values.get(i));
if (values.get(i).getClass().equals(Float.class))
pstm.setFloat(i+1, (Float) values.get(i));
}
pstm.execute();
这就是我得到的错误:
java.sql.SQLException: [Teradata Database] [TeraJDBC 15.10.00.05] [Error 5404] [SQLState HY000] Datetime field overflow.
at com.teradata.jdbc.jdbc_4.util.ErrorFactory.makeDatabaseSQLException(ErrorFactory.java:308)
at com.teradata.jdbc.jdbc_4.statemachine.ReceiveInitSubState.action(ReceiveInitSubState.java:109)
at com.teradata.jdbc.jdbc_4.statemachine.StatementReceiveState.subStateMachine(StatementReceiveState.java:307)
at com.teradata.jdbc.jdbc_4.statemachine.StatementReceiveState.action(StatementReceiveState.java:196)
at com.teradata.jdbc.jdbc_4.statemachine.StatementController.runBody(StatementController.java:123)
at com.teradata.jdbc.jdbc_4.statemachine.PreparedStatementController.run(PreparedStatementController.java:46)
at com.teradata.jdbc.jdbc_4.TDStatement.executeStatement(TDStatement.java:386)
at com.teradata.jdbc.jdbc_4.TDStatement.executeStatement(TDStatement.java:328)
at com.teradata.jdbc.jdbc_4.TDPreparedStatement.doPrepExecute(TDPreparedStatement.java:165)
at com.teradata.jdbc.jdbc_4.TDPreparedStatement.execute(TDPreparedStatement.java:2598)
at ProcessStatus.set(ProcessStatus.java:71)
at CMain.main(CMain.java:42)
例如,我知道我可以将 START_DATE 数据类型更改为 TIMESTAMP(3),但这似乎不是一件紧迫的事情,所以这就是我的原因请求您的帮助。
无论如何,我感谢你的时间和帮助。谢谢大家!!!
好吧,我找到了一种方法。
基本上我使用了 SimpleDateFormat 并将时间戳添加为字符串而不是时间戳对象。
类似的东西:
Calendar calendar = Calendar.getInstance();
Timestamp ts = new java.sql.Timestamp(calendar.getTime().getTime());
String mydate = new SimpleDateFormat("yyy-MM-dd hh:mm:ss").format(ts);
ArrayList<Object> values = new ArrayList<Object>();
values.add(0, mydate);
这是最终代码中的样子::
setConnection(); //IT IS OK, SO DONT WORRY!! =)
String insert = "insert into DATABASE.TABLE (START_DATE , STATUS, PROCESS)";
PreparedStatement pstm = getConnection().prepareStatement(insert);
Calendar calendar = Calendar.getInstance();
Timestamp ts = new java.sql.Timestamp(calendar.getTime().getTime());
String mydate = new SimpleDateFormat("yyy-MM-dd hh:mm:ss").format(ts);
ArrayList<Object> values = new ArrayList<Object>();
values.add(0, mydate);
values.add(1, new Integer(0));
values.add(2, "TEST_PROCESS");
for (int i = 0; i < values.size(); i++)
{
if (values.get(i).getClass().equals(Integer.class))
pstm.setInt(i+1, (Integer) values.get(i));
if (values.get(i).getClass().equals(String.class))
pstm.setString(i+1, (String) values.get(i));
if (values.get(i).getClass().equals(Timestamp.class))
pstm.setTimestamp(i+1, (Timestamp) values.get(i));
if (values.get(i).getClass().equals(Date.class))
pstm.setDate(i+1, (Date) values.get(i));
if (values.get(i).getClass().equals(Double.class))
pstm.setDouble(i+1, (Double) values.get(i));
if (values.get(i).getClass().equals(Float.class))
pstm.setFloat(i+1, (Float) values.get(i));
}
pstm.execute();
谢谢,希望对大家有所帮助!!
让我们假设以下 table:
CREATE MULTISET TABLE DATABASE.TABLE ,NO FALLBACK ,
NO BEFORE JOURNAL,
NO AFTER JOURNAL,
CHECKSUM = DEFAULT,
DEFAULT MERGEBLOCKRATIO
(
START_DATE TIMESTAMP(0) FORMAT 'DD-MMM-YYYYBHH:MI:SS',
STATUS DECIMAL(5,0) ,
PROCESS VARCHAR(100) CHARACTER SET LATIN CASESPECIFIC NOT NULL
)
PRIMARY INDEX ( PROCESS)
UNIQUE INDEX ( PROCESS, START_DATE );
我想做的是在 Java 上使用 PreparedStatement 插入 table,但它不起作用.. =/
这就是我在 Java 上所做的事情:
setConnection(); //IT IS OK, SO DONT WORRY!! =)
String insert = "insert into DATABASE.TABLE (START_DATE , STATUS, PROCESS)";
PreparedStatement pstm = getConnection().prepareStatement(insert);
ArrayList<Object> values = new ArrayList<Object>();
values.add(0, new java.sql.Timestamp(calendar.getTime().getTime()));
values.add(1, new Integer(0));
values.add(2, "TEST_PROCESS");
for (int i = 0; i < values.size(); i++)
{
if (values.get(i).getClass().equals(Integer.class))
pstm.setInt(i+1, (Integer) values.get(i));
if (values.get(i).getClass().equals(String.class))
pstm.setString(i+1, (String) values.get(i));
if (values.get(i).getClass().equals(Timestamp.class))
pstm.setTimestamp(i+1, (Timestamp) values.get(i));
if (values.get(i).getClass().equals(Date.class))
pstm.setDate(i+1, (Date) values.get(i));
if (values.get(i).getClass().equals(Double.class))
pstm.setDouble(i+1, (Double) values.get(i));
if (values.get(i).getClass().equals(Float.class))
pstm.setFloat(i+1, (Float) values.get(i));
}
pstm.execute();
这就是我得到的错误:
java.sql.SQLException: [Teradata Database] [TeraJDBC 15.10.00.05] [Error 5404] [SQLState HY000] Datetime field overflow.
at com.teradata.jdbc.jdbc_4.util.ErrorFactory.makeDatabaseSQLException(ErrorFactory.java:308)
at com.teradata.jdbc.jdbc_4.statemachine.ReceiveInitSubState.action(ReceiveInitSubState.java:109)
at com.teradata.jdbc.jdbc_4.statemachine.StatementReceiveState.subStateMachine(StatementReceiveState.java:307)
at com.teradata.jdbc.jdbc_4.statemachine.StatementReceiveState.action(StatementReceiveState.java:196)
at com.teradata.jdbc.jdbc_4.statemachine.StatementController.runBody(StatementController.java:123)
at com.teradata.jdbc.jdbc_4.statemachine.PreparedStatementController.run(PreparedStatementController.java:46)
at com.teradata.jdbc.jdbc_4.TDStatement.executeStatement(TDStatement.java:386)
at com.teradata.jdbc.jdbc_4.TDStatement.executeStatement(TDStatement.java:328)
at com.teradata.jdbc.jdbc_4.TDPreparedStatement.doPrepExecute(TDPreparedStatement.java:165)
at com.teradata.jdbc.jdbc_4.TDPreparedStatement.execute(TDPreparedStatement.java:2598)
at ProcessStatus.set(ProcessStatus.java:71)
at CMain.main(CMain.java:42)
例如,我知道我可以将 START_DATE 数据类型更改为 TIMESTAMP(3),但这似乎不是一件紧迫的事情,所以这就是我的原因请求您的帮助。
无论如何,我感谢你的时间和帮助。谢谢大家!!!
好吧,我找到了一种方法。
基本上我使用了 SimpleDateFormat 并将时间戳添加为字符串而不是时间戳对象。
类似的东西:
Calendar calendar = Calendar.getInstance();
Timestamp ts = new java.sql.Timestamp(calendar.getTime().getTime());
String mydate = new SimpleDateFormat("yyy-MM-dd hh:mm:ss").format(ts);
ArrayList<Object> values = new ArrayList<Object>();
values.add(0, mydate);
这是最终代码中的样子::
setConnection(); //IT IS OK, SO DONT WORRY!! =)
String insert = "insert into DATABASE.TABLE (START_DATE , STATUS, PROCESS)";
PreparedStatement pstm = getConnection().prepareStatement(insert);
Calendar calendar = Calendar.getInstance();
Timestamp ts = new java.sql.Timestamp(calendar.getTime().getTime());
String mydate = new SimpleDateFormat("yyy-MM-dd hh:mm:ss").format(ts);
ArrayList<Object> values = new ArrayList<Object>();
values.add(0, mydate);
values.add(1, new Integer(0));
values.add(2, "TEST_PROCESS");
for (int i = 0; i < values.size(); i++)
{
if (values.get(i).getClass().equals(Integer.class))
pstm.setInt(i+1, (Integer) values.get(i));
if (values.get(i).getClass().equals(String.class))
pstm.setString(i+1, (String) values.get(i));
if (values.get(i).getClass().equals(Timestamp.class))
pstm.setTimestamp(i+1, (Timestamp) values.get(i));
if (values.get(i).getClass().equals(Date.class))
pstm.setDate(i+1, (Date) values.get(i));
if (values.get(i).getClass().equals(Double.class))
pstm.setDouble(i+1, (Double) values.get(i));
if (values.get(i).getClass().equals(Float.class))
pstm.setFloat(i+1, (Float) values.get(i));
}
pstm.execute();
谢谢,希望对大家有所帮助!!