Matlab Database Toolbox Oracle Zugang Voraussetzungen Die Database Toolbox von Matlab gehört nicht zum Grundpaket, sie muß per Lizenz erworben und nachinstalliert werden. Es ist im Netinstall zu prüfen, ob Lizenzen verfügbar sind. Hinweis: Die Database Toolbox ist ab Version R2006a verfügbar. Auf der Matlab-Homepage gibt es eine 15 Tage Trialversion, die kostenfrei heruntergeladen werden kann. http://www.mathworks.com/products/database/ Die für die Installation notwendigen Lizenzinformationen finden sie unter About Matlab in Ihrer Matlab Installation unter Help. Die notwendigen Installationsschritte werden ausführlich mit dem Download beschrieben. Nach der erfolgreichen Installation kann die Toolbox genutzt werden. Soll ein ODBC-Zugang genutzt werden, so sind keine weiteren Einstellungen notwendig. Um hingegen einen Oracle JDBC Zugang zu nutzen, müssen in der classpath.txt von Matlab (siehe C:\Program Files\Matlab\R2006a\toolbox\local) die Oracle JDBC Treiber (.jar Files) bekannt gemacht werden. Die classpath.txt muß um die Pfadeinträge bzgl. der JDBC Treiber erweitert werden. Zu finden sind die JDBC-Source-Dateien normalerweise in C:\ORACLE\product\10.2.0\client_1\jdbc\lib. Daraus ergibt sich folgende classpath.txt-Erweiterung: C:\ORACLE\product\10.2.0\client_1\jdbc\lib\classes12.jar C:\ORACLE\product\10.2.0\client_1\jdbc\lib\ojdbc14.jar C:\ORACLE\product\10.2.0\client_1\jdbc\lib\ojdbc14_g.jar C:\ORACLE\product\10.2.0\client_1\jdbc\lib\ojdbc14dms.jar C:\ORACLE\product\10.2.0\client_1\jdbc\lib\ojdbc14dms_g.jar Es ist zu überprüfen, wo sich ihrer Oracle-Installation die classes12.zip befinden, dort sind auch die .jar-Dateien zu finden. Hinweis: In den folgenden Beispielen wird mit dem HR-Oracle-Example-Account gearbeitet. User: HR Passwort: HR Syntax am Matlab Prompt im Command Window Am Matlab Prompt kann man direkt ein Objekt definieren, mit dem man seinen Datenbankzugang handeln kann. conn = database('datasourcename','username','password') conn = database('databasename','username',... 'password','driver','databaseurl' bzw. Für all diejenigen, die in SQL nicht so sicher sind, steht der querybuilder zur Verfügung, dieser kann direkt vom Prompt im Command Window aus aufgerufen werden. ODBC-Zugang Syntax conn = database('datasourcename','username','password') Die ODBC-Source kann, falls noch nicht vorhanden, unter den WindowsSystemeinstellungen oder im Querybuilder eingerichtet werden. Beispiel für die bereits existente ODBC-Source mathconn: conn = database('mathconn','hr','hr') Im Command Window werden dann die Zugangseinstellungen noch einmal angezeigt: conn = Instance: UserName: Driver: URL: Constructor: Message: Handle: TimeOut: AutoCommit: Type: 'mathconn' 'hr' [] [] [1x1 com.mathworks.toolbox.database.databaseConnect] [] [1x1 sun.jdbc.odbc.JdbcOdbcConnection] 0 'on' 'Database Object' Am Handle sieht man bereits, dass eine JDBC-ODBC-Bridge genutzt wird. Der Zugang kann nun im Matlab Command Window mit ping(conn) getestet werden. Zurück bekommt man ein Antwort-Objekt, welches die Daten zusammengefasst darstellt: ans = DatabaseProductName: DatabaseProductVersion: JDBCDriverName: JDBCDriverVersion: MaxDatabaseConnections: CurrentUserName: DatabaseURL: AutoCommitTransactions: 'Oracle' '10.02.0020' 'JDBC-ODBC Bridge (SQORA32.DLL)' '2.0001 (10.02.0002)' 0 'hr' 'jdbc:odbc:mathconn' 'True' JDBC-Zugang Syntax conn = database('databasename','username',... 'password','driver','databaseurl') Beispiel: conn = database(Instanzname,’hr’,’hr’,'oracle.jdbc.driver.OracleDriver','jdbc:orac le:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=dbsrv01.desy.de)(PORT=15 21))(LOAD_BALANCE=yes)(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=desy_db .desy.de)(FAILOVER_MODE=(TYPE=NONE)(METHOD=BASIC)(RETRIES=180)(DELAY=5))))' ) Der Instanzname ist frei wählbar, ausser man möchte über eine bereits definierte JDBCSource die Verbindung aufbauen, dann ist hier der Name der JDBC-Source anzugeben. Eine JDBC-Source kann aus Matlab heraus, im Querybuilder, definiert werden. Im Command Window werden die Zugangseinstellungen noch einmal zusammengefasst angezeigt: conn = Instance: UserName: Driver: URL: Constructor: Message: Handle: TimeOut: AutoCommit: Type: 'DESY_DB' 'hr' 'oracle.jdbc.driver.OracleDriver' [1x233 char] [1x1 com.mathworks.toolbox.database.databaseConnect] [] [1x1 oracle.jdbc.driver.T4CConnection] 0 'on' 'Database Object' Der Zugang kann dann mit ping(conn) am Prompt getestet werden. Hierdurch erhält man ein Antwort-Objekt ans, welches im Command Window angezeigt wird: ans = DatabaseProductName: DatabaseProductVersion: JDBCDriverName: JDBCDriverVersion: MaxDatabaseConnections: CurrentUserName: DatabaseURL: AutoCommitTransactions: 'Oracle' [1x155 char] 'Oracle JDBC driver' '10.2.0.2.0' 0 'hr' [1x233 char] 'True' Fehlermeldungen 1. Laufende Datenbankverbindung Am Command Window Prompt sind die Fehlermeldungen leider Aussagefrei. Beispiel: Der folgende Aufruf am Prompt conn = database('DESY_DB_JDBC','hr','h2','oracle.jdbc.driver.OracleDriver','jdbc:o racle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=dbsrv01.desy.de)(PORT =1521))(LOAD_BALANCE=yes)(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=desy _db.desy.de)(FAILOVER_MODE=(TYPE=NONE)(METHOD=BASIC)(RETRIES=180)(DELAY=5)) ))') liefert die folgende Rückmeldung: conn = Instance: UserName: Driver: URL: Constructor: Message: Handle: TimeOut: AutoCommit: Type: 'DESY_DB_JDBC' 'hr' [] [] [1x1 com.mathworks.toolbox.database.databaseConnect] [1x51 char] 0 [] 'off' 'Database Object' Man sieht zwar schon an Driver und URL, dass da wohl was nicht funktioniert hat, aber eine Fehlermeldung bekommt man nicht. Erst der ping(conn) liefert zumindest eine Fehlermeldung: ??? Error using ==> database.ping Invalid connection. 2. Constructor Fehler Bekommt man nur noch Constructor-Fehler, so sollte Matlab einmal geschlossen und wieder geöffnet werden. Es ist auffällig, dass das Datenbankobjekt, hier conn, nicht mehr richtig initialisiert wurde. Auffällig ist dies, wenn man Befehle ausführt, die zuvor schon funktioniert haben und es keinen Grund gibt, dass sie nicht mehr funktionieren sollten. Bzgl. dieses „Speicherfreigabe- und Initialisierungsproblem“ gibt es von Matlab ein Patch bezogen auf die database.jar. Siehe: http://www.mathworks.com/support/bugreports/details.html?rp=305854 Eine neue database.jar kann hier heruntergeladen werden, sie ist dann gegen die alte database.jar auszutauschen. Auch wenn jetzt nur noch die neue database.jar genutzt wird, sollte die alte database.jar in database.jar.old umbenannt werden und nicht gelöscht werden. 3. Fehler beim Datenbankconnect: Die URL ist in den Beispielen nur auf den Host dbsrv01.desy.de bezogen, dies kann zu Fehlern führen, wenn dieser z.B. gerade nicht verfügbar ist. Die vollständige URL lautet: jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=dbsrv01.desy.de )(PORT=1521))(ADDRESS=(PROTOCOL = TCP)(HOST = dbsrv02.desy.de)(PORT = 1521))(ADDRESS = (PROTOCOL = TCP)(HOST = dbsrv03.desy.de)(PORT = 1521))(LOAD_BALANCE = yes)(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = desy_db.desy.de)(FAILOVER_MODE =(TYPE = NONE)(METHOD = BASIC)(RETRIES = 180)(DELAY = 5)))) Beispiel: >> conn = database('DESY_DB_JDBC','hr','hr','oracle.jdbc.driver.OracleDriver','jdbc:o racle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=dbsrv01.desy.de)(PORT =1521))(ADDRESS=(PROTOCOL = TCP)(HOST = dbsrv02.desy.de)(PORT = 1521))(ADDRESS = (PROTOCOL = TCP)(HOST = dbsrv03.desy.de)(PORT = 1521))(LOAD_BALANCE = yes)(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = desy_db.desy.de)(FAILOVER_MODE =(TYPE = NONE)(METHOD = BASIC)(RETRIES = 180)(DELAY = 5))))') conn = Instance: UserName: Driver: URL: Constructor: Message: Handle: TimeOut: AutoCommit: Type: 'DESY_DB_JDBC' 'hr' 'oracle.jdbc.driver.OracleDriver' [1x377 char] [1x1 com.mathworks.toolbox.database.databaseConnect] [] [1x1 oracle.jdbc.driver.T4CConnection] 0 'on' 'Database Object' ans = DatabaseProductName: DatabaseProductVersion: JDBCDriverName: JDBCDriverVersion: MaxDatabaseConnections: CurrentUserName: DatabaseURL: AutoCommitTransactions: 'Oracle' [1x155 char] 'Oracle JDBC driver' '10.2.0.2.0' 0 'HR' [1x377 char] 'True' 4. Datenbankfehler Um Datenbankfehler, wie locked User zu vermeiden ist darauf zu achten, dass sich auch unter Matlab immer wieder korrekt mit close(conn) von der Datenbank abgemeldet wird. Links Bugreports bzgl. der Database Toolbox: http://www.mathworks.com/support/bugreports/index.html?release=R2006b&produ ct=DB&topic=All+Categories&x=10&y=26 Dokumentation der Database Toolbox: http://www.mathworks.com/access/helpdesk/help/toolbox/database/ Newsletter: http://www.mathworks.com/company/newsletters/