Teradata - FastLoad mit Unicode-Zeichen

DrJim

Mitglied
Hallo zusammen,

ich versuche seit Stunden vergeblich die richtigen Infos zum genannten Thema zu finden. Ich möchte via Java FastLoad-Inserts in Teradata machen.

Mit diesem Befehl funktioniert der Fastload-Insert:
pstmtFld.setAsciiStream(1, dataStream, -1);
pstmtFld.executeUpdate();

Leider bringt mir das nur begrenzt etwas, da in den Daten Unicode-Zeichen enthalten sind und so sehr viele Zeilen nicht importiert werden können. Ich habe viel gegoogelt und verschiedenstes probiert:

pstmtFld.setCharacterStream(1, new InputStreamReader(dataStream),(int) dataFile.length());;
pstmtFld.executeUpdate();
Ergebnis:
com.teradata.jdbc.jdbc_4.util.JDBCException: [Teradata JDBC Driver] [TeraJDBC 13.10.00.32] [Error 1093] [SQLState HY000] This method is not implemented

pstmtFld.setCharacterStream(1, new InputStreamReader(dataStream));
pstmtFld.executeUpdate();
Ergebnis:
java.lang.AbstractMethodError:...

pstmtFld.setUnicodeStream(1, dataStream, -1);
pstmtFld.executeUpdate();
Ergebnis:
com.teradata.jdbc.jdbc_4.util.JDBCException: [Teradata JDBC Driver] [TeraJDBC 13.10.00.32] [Error 1093] [SQLState HY000] This method is not implemented


pstmtFld.setCharacterStream(1, new InputStreamReader(dataStream),dataFile.length());
pstmtFld.executeUpdate();
Ergebnis:
java.lang.AbstractMethodError:...


Hat jemand einen Tipp, was ich verkehrt mache bzw. noch eine Idee, was ich sonst noch ausprobieren könnte um den FastLoad mit Umlauten und anderen Sonderzeichen zum laufen bringen könnte?

Wäre super! :)
 

fehlerfinder

Bekanntes Mitglied
Teradata kenne ich leider nicht. Aber dieses "This method is not implemented" ist schon irgendwie auffällig ;-) Was für einen Daten-Typ hat den pstmtFld? Hast du mal ein - möglichst simples, aber lauffähiges - Beispielprogramm?
 

DrJim

Mitglied
Also erstmal zu der Frage:

PreparedStatement ist der Datentyp.

Ich habe mein Problem jetzt selbst lösen können: Beim Schreiben wurde die CSV Datei in ANSI kodiert. Sobald ich die Datei in UTF8 ohne BOM abspeichere kann ich auch mit dem Befehl pstmtFld.setAsciiStream(1, dataStream, -1);
alle Unicode-Zeichen, die bisher in den Daten vorkamen, importieren.

Trotzdem hier noch das mölgichst einfache FastLoad-Beispiel (die Zugangsdaten und jdbc-urls müssen natürlich noch angepasst werden).

In der zugehörigen FastLoad1.csv (gespeichert in UTF8 ohne BOM)stehen die Daten so:
headline;head2
test1; %feld1
test2; ß2
test3;xxxxx

Java:
import java.sql.*;
import java.io.*;

public class MiniFastLoad {
	public static String user = "xxx";
	public static String password = "xxx";

	public static void main(String[] args) throws ClassNotFoundException,
			IOException {
		// URLs to be passed to the JDBC driver
		String urlStd = "jdbc:teradata://xxx/charset=UTF8";
		String urlFld = "jdbc:teradata://xxx/charset=UTF8,FIELD_SEP=';',TYPE=FASTLOADCSV";

		// Name of sample table
		String tableName = "ov_yf_db.FastLoadSample";
		String tableNameErr1 = tableName + "_ERR_1";
		String tableNameErr2 = tableName + "_ERR_2";

		// Name of sample CSV data file
		String dataFile = "FastLoad1.csv";

		// CREATE TABLE statement
		String createTable = "CREATE TABLE "
				+ tableName
				+ ","
				+ "NO FALLBACK,"
				+ "NO BEFORE JOURNAL,"
				+ "NO AFTER JOURNAL,"
				+ "CHECKSUM = DEFAULT"
				+ "("
				+ " L_TEXT VARCHAR(10)"
				+ " CHARACTER SET UNICODE NOT CASESPECIFIC,"
				+ " L_TEXT2 VARCHAR(1000)"
				+ " CHARACTER SET  LATIN NOT CASESPECIFIC" + ") "
				+ "PRIMARY INDEX ( L_TEXT )";


		String insertTable = "INSERT INTO " + tableName + " VALUES(?,?);";

		try {

			Class.forName("com.teradata.jdbc.TeraDriver");
			Connection conStd = DriverManager.getConnection(urlStd, user,
					password);
			try {
				Statement stmtStd = conStd.createStatement();
				try {
					try {
						stmtStd.executeUpdate("DROP TABLE " + tableNameErr1);
						stmtStd.executeUpdate("DROP TABLE " + tableNameErr2);
						stmtStd.executeUpdate("DROP TABLE " + tableName);
					} catch (SQLException e) {
						System.out.println(e.toString());
					}
					stmtStd.executeUpdate(createTable);
					InputStream dataStream = new FileInputStream(new File(
							dataFile));

					try {
						Connection conFld = DriverManager.getConnection(urlFld,
								user, password);
						try {
							PreparedStatement pstmtFld = conFld
									.prepareStatement(insertTable);
							try {

								pstmtFld.setAsciiStream(1, dataStream, -1);
								pstmtFld.executeUpdate();

							} catch (SQLException e) {
								System.out.println(e.toString());

							} catch (Throwable e) {
								System.out.println(e.toString());

							} finally {
								pstmtFld.close();
							}

						} finally {
							conFld.close();
						}
					} finally {
						dataStream.close();
					}
				} finally {
					stmtStd.close();
				}
			} finally {
				conStd.close();
			}
		} catch (SQLException e) {
			System.out.println(e.toString());

			throw new IllegalStateException("FastLoad failed.");
		}
	}

}
 
Zuletzt bearbeitet:

Oben