Supportnet / Forum / Datenbanken
Oracle-Daten in Text-Datei schreiben
Frage
Hallo,
ich habe eine Oracle 8i-Datenbank. Auf diese Datenbank selectiere ich nachfolgendes Statement:
select spanr,sbestellnr,nlosgroesse from pa_kopf_we where npastatusnr = 1;
Das SQL-Tool das ich hierfür benutze ist von SQLBase und heißt SQLTALK.EXE.
Aus diesem select soll die Text-Datei "c:\temp\pastatus.txt" erzeugt werden.
Die 3 Spalten sollen mit dem Zeichen ; getrennt ausgegeben werden.
Existiert die Datei bei erneuter Ausgabe, sollen die "neuen" Daten angehängt werden.
Diese Funktion möchte ich dann per "geplanter Task" ausführen lassen.
Kann mir da jemand weiterhelfen?
Gruß
Werner
Antwort 1 von Ingolf Seidel
Hallo Werner:
Habe zwar nicht Deine Problemstellung, aber den Zugriff von extern auf Oracle-DBs realisiere ich (wenn auch aus anderen Gründen) via VB- oder JavaScript-Lösungen, die über DAO eine ODBC-Verknüpfung zur jeweiligen DB nutzen.
Vorteil: Aufbereitung der Ergebnisse via Scripting (einfach) und beliebige Weiterverarbeitung. Zudem könntest Du die Ausführung des entsprechenden Scripts als Task nach Belieben einrichten.
Gruss, Ingolf.
Habe zwar nicht Deine Problemstellung, aber den Zugriff von extern auf Oracle-DBs realisiere ich (wenn auch aus anderen Gründen) via VB- oder JavaScript-Lösungen, die über DAO eine ODBC-Verknüpfung zur jeweiligen DB nutzen.
Vorteil: Aufbereitung der Ergebnisse via Scripting (einfach) und beliebige Weiterverarbeitung. Zudem könntest Du die Ausführung des entsprechenden Scripts als Task nach Belieben einrichten.
Gruss, Ingolf.
Antwort 2 von Werner
Hallo Ingolf,
diese Lösung hatte ich auch schon angedacht.
Habe in Sachen VB und JavaScript wenig Einblick.
Kannst Du mir in Sachen VB einen Einstieg geben?
Ich gehe übrigens auch per ODBC auf die Datenbank.
Gruß
Werner
diese Lösung hatte ich auch schon angedacht.
Habe in Sachen VB und JavaScript wenig Einblick.
Kannst Du mir in Sachen VB einen Einstieg geben?
Ich gehe übrigens auch per ODBC auf die Datenbank.
Gruß
Werner
Antwort 3 von Ingolf Seidel
Hallo Werner:
Ich werde Dir heute abend die entsprechenden Fragmente zur Verfügung stellen, so daß Du die Programmteile morgen abrufen kannst.
Ich hoffe, daß es für Dich OK ist.
Gruss, Ingolf.
Ich werde Dir heute abend die entsprechenden Fragmente zur Verfügung stellen, so daß Du die Programmteile morgen abrufen kannst.
Ich hoffe, daß es für Dich OK ist.
Gruss, Ingolf.
Antwort 4 von Werner
Hallo Ingolf,
ist OK.
Vielen Dank im voraus.
Gruß
Werner
ist OK.
Vielen Dank im voraus.
Gruß
Werner
Antwort 5 von Ingolf Seidel
Guten Abend Werner:
Habe nun die Fragmente etwas anonymisiert, so daß ich sie Dir nachfolgend anbieten kann. Wie im Code vermerkt, findest Du z.B. unter www.msdn.com (Stichworte DAO, OpenRecordSet, ...) ziemlich viele Infos zum Umgang mit DAO und ODBC, aber leider kein einfaches Beispiel wie es denn geht (oder das Beispiel geht irgendwo in der Fülle der Informationen unter).
So, genug der Worte, der Code folgt, ich hoffe, es hilft Dir,
Gruß, Ingolf.
'#######################################################################################
' name : beispiel fuer vbscript und oracle
'#######################################################################################
' ...
' datenbankobjekte
Dim odbcConnect
Dim daoWorkSpace
Dim db
Dim dao36
Dim rs
' dao konstanten
' hinweis: weitere infos zu dao und den moeglichkeiten finden sich unter www.msdn.com
Const dbOpenDynaset = 2
Const dbSQLPassThrough = 64
'#######################################################################################
Sub initODBC()
' definition der odbc-verbindung.
'#######################################################################################
odbcConnect = "ODBC;DSN=<dsn-name>;Database=<oracle-instanz>;UID=<user-name>;PWD=<passwort>;"
End Sub
'#######################################################################################
Sub main()
' beispiel fuer den einstiegspunkt eines scripts. wuerde mit call main in einem eigenstaendigen
' vbscript aufgerufen.
'#######################################################################################
' ...
' odbc-verbindung definieren
Call initODBC
' datenbank-verbindung aufbauen
If initDB = False Then
MsgBox("Die Datenbankverbindung kann nicht aufgebaut werden." & vbCrLf & " Das Script wird beendet.")
Else
' ...
' datenbank und dao-workspace schliessen
db.close
daoWorkSpace.close
End If
End Sub
'#######################################################################################
Function initDB()
' aufbau der datenbankverbindung.
'#######################################################################################
' fehlercode
initDB = True
' dao kommunikation definieren
Set dao36 = CreateObject("DAO.DBEngine.36")
Set daoWorkSpace = dao36.CreateWorkspace("NewODBCWrk", "admin", dbUseODBC)
If Err.Number <> 0 Then
' fehlercode setzen
initDB = False
MsgBox("dao36.CreateWorkspace" & Err.Number & ":" & Err.Description)
Err.clear
End If
' datenbank verbindung aufbauen
Set db = daoWorkSpace.OpenDatabase("e5_ergotime", dbDriverNoPrompt, False, odbcConnect)
If Err.Number <> 0 Then
' fehlercode setzen
initDB = False
MsgBox("daoWorkSpace.OpenDatabase" & Err.Number & ":" & Err.Description)
Err.clear
End If
End Function
'#######################################################################################
Function sqlExecute(exportDB, sql, rs, mode)
' ausfuehren von sql via odbc
' mode = 0 ... read-operation
' mode = 1 ... write-operation
'#######################################################################################
' flag fuer erfolg = true oder misserfolg = false
sqlExecute = False
' MsgBox(sql)
Set rs = exportDB.OpenRecordset(sql, dbOpenDynaset, dbSQLPassThrough)
If mode = 0 Then
' bei read-operation true, wenn recordset geliefert wird
If Not rs.BOF Then
If Not rs.EOF Then
sqlExecute = True
End If
End If
Else
' bei write-operationen true setzen
sqlExecute = True
End If
End Function
'#######################################################################################
Function xyz(param1, param2)
' beispiele fuer schreiben (= insert) und lesen (= select) der oracle-db.
'#######################################################################################
Dim sql
Dim sqlReturn
' beispiel fuer insert
sql = "INSERT INTO XXX ("
sql = sql & "0" & ","
sql = sql & "'" & param1 & "'" & ","
sql = sql & "'" & param2 & "'" & ")"
sqlReturn = sqlExecute(db, sql, rs, 1)
' beispiel fuer select mit anschliessender auswertung des gelieferten recordsets rs
sql = "SELECT ZZZ FROM DUAL"
sqlReturn = sqlExecute(db, sql, rs, 0)
If sqlReturn = True Then
' hinweis: in rs.fields(...) stehen die rueckgabewerte des selects.
' die dimension (= anzahl der werte von fields) entspricht der
' anzahl der rueckgabewerte des selects.
setNewReport = rs.fields(0)
End If
' ...
' hinweis: die ergebnisse, die ueber selects aus der datenbank extrahiert werden,
' koennen dann z.b. in eine textdatei exportiert werden. zum umgang mit textdateien
' bei vbscript unter filesystemobject suchen. damit lassen sich einfach dateien
' erzeugen und mit writeln(...) auch schreiben.
End Function
Habe nun die Fragmente etwas anonymisiert, so daß ich sie Dir nachfolgend anbieten kann. Wie im Code vermerkt, findest Du z.B. unter www.msdn.com (Stichworte DAO, OpenRecordSet, ...) ziemlich viele Infos zum Umgang mit DAO und ODBC, aber leider kein einfaches Beispiel wie es denn geht (oder das Beispiel geht irgendwo in der Fülle der Informationen unter).
So, genug der Worte, der Code folgt, ich hoffe, es hilft Dir,
Gruß, Ingolf.
'#######################################################################################
' name : beispiel fuer vbscript und oracle
'#######################################################################################
' ...
' datenbankobjekte
Dim odbcConnect
Dim daoWorkSpace
Dim db
Dim dao36
Dim rs
' dao konstanten
' hinweis: weitere infos zu dao und den moeglichkeiten finden sich unter www.msdn.com
Const dbOpenDynaset = 2
Const dbSQLPassThrough = 64
'#######################################################################################
Sub initODBC()
' definition der odbc-verbindung.
'#######################################################################################
odbcConnect = "ODBC;DSN=<dsn-name>;Database=<oracle-instanz>;UID=<user-name>;PWD=<passwort>;"
End Sub
'#######################################################################################
Sub main()
' beispiel fuer den einstiegspunkt eines scripts. wuerde mit call main in einem eigenstaendigen
' vbscript aufgerufen.
'#######################################################################################
' ...
' odbc-verbindung definieren
Call initODBC
' datenbank-verbindung aufbauen
If initDB = False Then
MsgBox("Die Datenbankverbindung kann nicht aufgebaut werden." & vbCrLf & " Das Script wird beendet.")
Else
' ...
' datenbank und dao-workspace schliessen
db.close
daoWorkSpace.close
End If
End Sub
'#######################################################################################
Function initDB()
' aufbau der datenbankverbindung.
'#######################################################################################
' fehlercode
initDB = True
' dao kommunikation definieren
Set dao36 = CreateObject("DAO.DBEngine.36")
Set daoWorkSpace = dao36.CreateWorkspace("NewODBCWrk", "admin", dbUseODBC)
If Err.Number <> 0 Then
' fehlercode setzen
initDB = False
MsgBox("dao36.CreateWorkspace" & Err.Number & ":" & Err.Description)
Err.clear
End If
' datenbank verbindung aufbauen
Set db = daoWorkSpace.OpenDatabase("e5_ergotime", dbDriverNoPrompt, False, odbcConnect)
If Err.Number <> 0 Then
' fehlercode setzen
initDB = False
MsgBox("daoWorkSpace.OpenDatabase" & Err.Number & ":" & Err.Description)
Err.clear
End If
End Function
'#######################################################################################
Function sqlExecute(exportDB, sql, rs, mode)
' ausfuehren von sql via odbc
' mode = 0 ... read-operation
' mode = 1 ... write-operation
'#######################################################################################
' flag fuer erfolg = true oder misserfolg = false
sqlExecute = False
' MsgBox(sql)
Set rs = exportDB.OpenRecordset(sql, dbOpenDynaset, dbSQLPassThrough)
If mode = 0 Then
' bei read-operation true, wenn recordset geliefert wird
If Not rs.BOF Then
If Not rs.EOF Then
sqlExecute = True
End If
End If
Else
' bei write-operationen true setzen
sqlExecute = True
End If
End Function
'#######################################################################################
Function xyz(param1, param2)
' beispiele fuer schreiben (= insert) und lesen (= select) der oracle-db.
'#######################################################################################
Dim sql
Dim sqlReturn
' beispiel fuer insert
sql = "INSERT INTO XXX ("
sql = sql & "0" & ","
sql = sql & "'" & param1 & "'" & ","
sql = sql & "'" & param2 & "'" & ")"
sqlReturn = sqlExecute(db, sql, rs, 1)
' beispiel fuer select mit anschliessender auswertung des gelieferten recordsets rs
sql = "SELECT ZZZ FROM DUAL"
sqlReturn = sqlExecute(db, sql, rs, 0)
If sqlReturn = True Then
' hinweis: in rs.fields(...) stehen die rueckgabewerte des selects.
' die dimension (= anzahl der werte von fields) entspricht der
' anzahl der rueckgabewerte des selects.
setNewReport = rs.fields(0)
End If
' ...
' hinweis: die ergebnisse, die ueber selects aus der datenbank extrahiert werden,
' koennen dann z.b. in eine textdatei exportiert werden. zum umgang mit textdateien
' bei vbscript unter filesystemobject suchen. damit lassen sich einfach dateien
' erzeugen und mit writeln(...) auch schreiben.
End Function
Antwort 6 von Wener
Hallo Ingolf,
bin mit deiner Hilfe schon etwas weiter gekommen.
Ich habe aber mit der Funktion initDB
"Set db = daoWorkSpace.OpenDatabase("e5_ergotime", dbDriverNoPrompt, False, odbcConnect)"
noch Probleme.
An dieser Stelle bekomme ich einen Laufzeitfehler 3151 ODBC-Verbindung zu 'CAQ' fehlgeschlagen.
Kannst du mir helfen?
Gruß
Werner
bin mit deiner Hilfe schon etwas weiter gekommen.
Ich habe aber mit der Funktion initDB
"Set db = daoWorkSpace.OpenDatabase("e5_ergotime", dbDriverNoPrompt, False, odbcConnect)"
noch Probleme.
An dieser Stelle bekomme ich einen Laufzeitfehler 3151 ODBC-Verbindung zu 'CAQ' fehlgeschlagen.
Kannst du mir helfen?
Gruß
Werner
Antwort 7 von Ingolf Seidel
Hallo Werner:
Wenn Deine die DSN Deiner ODBC-Verbindung den Namen XYZ hat, dann müßte "Set db = daoWorkSpace.OpenDatabase("XZY", dbDriverNoPrompt, False, odbcConnect)" funktionieren.
D.h. setze die DSN ein, die auch in "odbcConnect = "ODBC;DSN=<dsn-name>;Database=<oracle-instanz>;UID=<user-name>;PWD=<passwort>;" als dsn-name verwendet wurde.
Gruß und viel Erfolg,
Ingolf.
Wenn Deine die DSN Deiner ODBC-Verbindung den Namen XYZ hat, dann müßte "Set db = daoWorkSpace.OpenDatabase("XZY", dbDriverNoPrompt, False, odbcConnect)" funktionieren.
D.h. setze die DSN ein, die auch in "odbcConnect = "ODBC;DSN=<dsn-name>;Database=<oracle-instanz>;UID=<user-name>;PWD=<passwort>;" als dsn-name verwendet wurde.
Gruß und viel Erfolg,
Ingolf.
Antwort 8 von Werner
Hallo Ingolf,
suuuper!!!!
Es läuft.
Vielen Dank.
Gruß Werner
PS.: An das auslesen gehe ich die nächsten Tage!
suuuper!!!!
Es läuft.
Vielen Dank.
Gruß Werner
PS.: An das auslesen gehe ich die nächsten Tage!

