Matlab-Oracle Database Tool - DESY

Werbung
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/
Herunterladen