ORA-7445 [kkzgiojt()+8] bei Fast Refreshable MatViews nach dem Einspielen des PSU 11.2.0.3.7

Das Einspielen des Patches 11.2.0.3.7 (PSU) führt bei der Verwendung von Fast Refreshable MatViews unter anderem zu einem ORA-7445 [kkzgiojt()+8].
Dies hat zur Folge, dass alle Fast Refreshable MatViews sich nicht mehr refreshen lassen bzw. nicht mehr refreshed werden.

Dies ist bekannter Oracle Bug 17230530, der seine Ursache im besagten PSU hat. Zu diesem gibt es schon seit einiger Zeit auch den entsprechenden Patch. Dieser ist resp. wird auch in allen nachfolgenden PSU enthalten sein, so dass dieser One-Off Patch nicht mehr manuell nachgezogen werden muss, wenn weitere PSU eingespielt werden.

Detaillierte Informationen befinden sich in der ML Note 1573704.1

In meinem Fall hatte ich Fast Refreshable MatViews – on Commit eingesetzt.
Der Fehler hatte zur Folge, dass zwar alle DML auf den der MatViews zugrundeliegenden Basistabellen noch funktionierten, beim Commit dann aber die Fehlermeldung

ORA-12008: error in materialized view refresh path
ORA-01741: illegal zero-length identifier 

auftrat.

Die eigentliche Anwendung, die über einen Applikationserver in Verbindung mit Hypernate auf die DB zugreifft, protokolliert dann immer nur die (Java-) Fehlermeldung

transaction not active

ohne jedoch irgendwelche Oracle Fehlermeldung auch zu protokollieren.

Instrumentalisieren von JDBC-Thin Verbindungen

Beim Aufbau einer JDBC-Thin Verbindung zur Datenbank werden in der Regel viele Spalten der v$session mir festen Defaults gesetzt – ganz im Gegensatz zu einer SQL*Net Verbindung.
Dies lässt sich allerdings durch ein paar Zeilen Code sehr leicht beheben:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
public Connection openDBCon(String userId
			, String passWord
			, String xmldb
			, Logging l
			, SQLExcep ex) {
 
	Connection con = null;
	String nameForConnect = userId;
        String basisUrl = "jdbc:oracle:thin:@";
        String driverName = "oracle.jdbc.driver.OracleDriver";
        String Url = basisUrl + driverName;
 
        String myName = "ProgName";                     // Name des Programms        String hostName = InetAddress.getLocalHost().getCanonicalHostName();        String processName = myName + "@" + hostName; 
	if (nameForConnect.equalsIgnoreCase("SYS")) {
		nameForConnect = nameForConnect + " as sysdba";
	}
 
	try {
		Properties pro = new java.util.Properties();
 
		pro.setProperty("password", passWord);
		pro.setProperty("user", nameForConnect);
 
		try {			pro.put("ApplicationName", NotNull( myName, "ApplicationName"));			pro.put("ClientHostname", NotNull( hostName, "ClientHostname"));			pro.put("ClientUser", NotNull( System.getProperty("user.name"), "ClientUser"));			pro.put("v$session.osuser", NotNull( System.getProperty("user.name"), "osuser"));			pro.put("v$session.machine", NotNull( hostName, "machine"));			pro.put("v$session.program", NotNull( myName + ".jar", "program"));			pro.put("v$session.process", NotNull( processName, "process"));			pro.put("v$session.terminal", NotNull( Strip(hostName), "terminal"));		} catch (Exception ignore) {		} 
		DriverManager.registerDriver(new oracle.jdbc.OracleDriver());
		Class.forName(driverName).newInstance();
 
		con = DriverManager.getConnection(Url, pro);
 
		setDbMetaData(con.getMetaData());
		setClientPro(con.getClientInfo());
 
		return con;
 
	} catch (ClassNotFoundException e) {
		// Could not find the database driver
		System.out.println(e);
		e.printStackTrace();
	} catch (SQLException sqle) {
		ex.printSQLException(sqle, xmldb, l);
	} catch (Exception e) {
		System.out.println(e);
		e.printStackTrace();
	}
 
	return con;
}