# ORA-00911: Ungültiges Zeichen



## naeko (14. Dezember 2006)

Hallo,
ich versuche aus einer Java-Applikation ein ganz normales SQL-Statement auf Oracle-DB auszuführen und zwar:

	public ResultSet getCountries(Connection connection)
	{
                ResultSet res = null;
//mein SQL-Statement:
		String sql = "SELECT * FROM Regionen ORDER BY                     "+Country.COLUMN_REGIONSID+" ASC;";

		try {
			res = getResult(connection, sql);
		}
		catch (SQLException e) {
                       //ICH LANDE IMMER HIER
			System.out.println("Error on execute sql statement. " + e);
		}
		return res;
}

private ResultSet getResult(Connection connection, String sql) throws SQLException
	{
		ResultSet res = null;

		if (connection != null)
		{
			Statement statement = connection.createStatement();

			if (statement.execute(sql)) //GENAU HIER KRACHTS
			{
				res = statement.executeQuery(sql);
			}
		}
		else
			throw new SQLException("No Database connection available!");

		return res;
	}
in der catch-Anweisung von getCountries() lande ich immer mit der Fehlermeldung:
Error on execute sql statement. java.sql.SQLException: ORA-00911: Ungültiges Zeichen
Das SQL-Statement an sich ist richtig (habe den im Oracle SQL Developer getestet und richtige Ergebnismenge bekommen)
Kann mir da jemand auf meinen Fehler hinweisen?
Danke


----------



## Exceptionfault (14. Dezember 2006)

Lass mal das ";" Semikolon am Ende deines Strings weg.

```
String sql = "SELECT * FROM Regionen ORDER BY "+Country.COLUMN_REGIONSID+" ASC";
```


----------



## naeko (15. Dezember 2006)

super.......danke
weiß jemand wie ich ein Feld in Oracle anlegen kann um
a) vierstelliges Jahr angezeigt zu bekommen (bei mir ist es beim Typeate immer 2-stellig)
b) eine Zahl mit 2 Nachkommastellen (kann ich da schlichtes Number nehmen?)
Danke


----------



## Exceptionfault (15. Dezember 2006)

> a) vierstelliges Jahr angezeigt zu bekommen (bei mir ist es beim Typeate immer 2-stellig)


Oracle hat immer ein 4-stelliges Jahr im Datentyp DATE. Die Darstellung ist eine reine Konfigurationssache der Umgebung. Du kannst mit folgendem Befehl festlegen wie ein Datum standardmässig als Text dargestellt werden soll:


```
SQL> ALTER SESSION SET NLS_DATE_FORMAT = 'DD.MM.YYYY HH24:MI:SS';
Session wurde geõndert.

SQL> select sysdate from dual;

SYSDATE
-------------------
15.12.2006 10:53:11

1 Zeile wurde ausgewõhlt.

SQL> ALTER SESSION SET NLS_DATE_FORMAT = 'MM/DD/YY HH24:MI';

Session wurde geõndert.

SQL> select sysdate from dual;

SYSDATE
--------------
12/15/06 10:54

1 Zeile wurde ausgewõhlt.
```



> b) eine Zahl mit 2 Nachkommastellen (kann ich da schlichtes Number nehmen?)


Ein NUMBER geht natürlich, ist aber etwas überdimensioniert. Je genauer du angibst, welche Größe und Präzision ( NKSt ) du erwartest, desto besser.

Also:
NUMBER( 12, 2 ) ist eine Zahl mit insg. 12 Ziffern, davon 10 Vorkomma und 2 Nachkomma


----------



## MPr (15. Dezember 2006)

allerdings sind die Angaben zu precision und scale bei einer NUMBER-Spalte nur als Constraints zu verstehen: ein NUMBER(12,2) Feld kann also nur insgesamt 12 Stellen beinhalten, von denen 2 Nachkommastellen sind. Auf den erforderlichen Speicherplatzbedarf hat die Wahl von NUMBER oder NUMBER(12,2) aber keinen Einfluss:


```
SQL> create table test(a number, b number(12,2));

Tabelle wurde erstellt.

SQL> insert into test values (9999999999.99, 9999999999.99);

1 Zeile wurde erstellt.

SQL> select vsize(a), vsize(b) from test;

  VSIZE(A)   VSIZE(B)
---------- ----------
         7          7
```

Gruß

MP


----------

