SQL-Scripts

Advantage Database Server

Moderator: Moderatoren

Antworten
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

SQL-Scripts

Beitrag von UliTs »

Hallo allerseits,

ich möchte ein SQL-Script schreiben, welches zu einem Datensatz den Inhalt aller Felder in eine Textvariable schreibt.
Das könnte so aussehen:

Code: Alles auswählen

DECLARE cursor1 CURSOR AS SELECT * FROM test;
OPEN cursor1;
IF FETCH cursor1
  WHILE // Jetzt eine Schleife über alle Felder der Tabelle
     ...
     SET cText = cText + ...
  END WHILE
END IF;
Weiß jemand, wie es geht?

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: SQL-Scripts

Beitrag von UliTs »

Ich habe inzwischen folgendes rausgefunden:
Man könnte

Code: Alles auswählen

sp_getColumns()
oder

Code: Alles auswählen

system.columns
benutzen. Blöderweise möchte ich das Ganze aber in einem Trigger für die beiden Tabellen __old und __new einsetzen. Und damit klappt es so nicht :( .

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: SQL-Scripts

Beitrag von AUGE_OHR »

hi,

mit PostgreSQL könnte es so aussehen

Code: Alles auswählen

   cVar1 := "BEGIN WORK;"
   cVar2 := "DECLARE MyCursor CURSOR FOR SELECT " + cField +;
            " FROM " + cTable + " ORDER BY " + cOrder

   cVar4 := "FETCH FORWARD " + cLimit  + " FROM MyCursor"
   cVar5 := "CLOSE MyCursor;"
   cVar6 := "COMMIT WORK;"
damit bekommst du nun das gesamte Resultset und kannst damit dann deine "Schleife" fahren.
gruss by OHR
Jimmy
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: SQL-Scripts

Beitrag von UliTs »

Hallo Jimmy,

danke für den Hinweis.
Aber Dein Lösungsansatz funktioniert so nicht.
Das Problem ist ja, dass ich an der Stelle die Feldnamen nicht kenne!
Bei Deinem Ansatz gehst Du außerdem von nur einer Spalte und mehreren Zeilen aus.
Aber beim Ändern eines Datensatzes ist es genau umgekehrt: man hat (garantiert) nur eine Zeile, jedoch (im allgemeinen) mehrere Spalten...

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2934
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 13 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Re: SQL-Scripts

Beitrag von Wolfgang Ciriack »

Hallo Uli,
gibts denn beim ADS nicht so etwas wie bei MS oder MySQL, wo du die Struktur einer Tabelle abfragen kannst ?

SHOW CREATE TABLE mytable
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES...
Viele Grüße
Wolfgang
hschmidt
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 164
Registriert: Mo, 09. Jan 2006 17:06
Wohnort: Paderborn
Hat sich bedankt: 2 Mal
Kontaktdaten:

Re: SQL-Scripts

Beitrag von hschmidt »

Wolfgang Ciriack hat geschrieben:gibts denn beim ADS nicht so etwas wie bei MS oder MySQL, wo du die Struktur einer Tabelle abfragen kannst ?
Das geht so:

SELECT * FROM SYSTEM.COLUMNS WHERE PARENT = 'TableName'

Viele Grüße

Hans
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: SQL-Scripts

Beitrag von UliTs »

Hallo Wolfgang, hallo Hans,

vielen Dank für Eure Info's.
Leider habe ich in der Doku zu dem Schlagwort INFORMATION_SCHEMA nichts gefunden und beim ADS gibt es kein SQL-Statement, welches mit SHOW beginnt...
Hans, wie schon vorher geschrieben, funktioniert dein Statement leider nicht bei den Tabellen __Old und __New bei Triggern.

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Benutzeravatar
nightcrawler
1000 working lines a day
1000 working lines a day
Beiträge: 650
Registriert: Di, 24. Apr 2012 16:33
Wohnort: 72184 Weitingen
Hat sich bedankt: 3 Mal
Danksagung erhalten: 96 Mal
Kontaktdaten:

Re: SQL-Scripts

Beitrag von nightcrawler »

im Trigger gibt es aber die Information, wie die Tabelle heißt (::stmt.TrigTableName) und damit kommt man über das Schema an die spalten ran:

Code: Alles auswählen

select * from system.columns where parent like ::stmt.TrigTableName
darüber einen Cursor öffnen und durchlaufen ... jetzt wirds noch komplexer, weil man ja auch noch über diesen Umweg auf die Quelle zugreifen muss (also,statement als string zusammenbauen und dann über execute immediate aufrufen).
--
Joachim
Joachim Dürr Softwareengineering
https://www.jd-engineering.de
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: SQL-Scripts

Beitrag von UliTs »

Hallo Joachim,

danke für die Tipps! Und auch danke für den Hinweis auf das zweite Problem, welches ich noch gar nicht erwähnt habe!
Aber wird es gehen:
1) ::stmt.TrigTableName benutzen
2) benötigtes SQL-Statement bilden und im String speichern
3) Statement im String mittels execute immediate ausführen

1) habe ich trotz der guten Dokumentation nicht rausbekommen...

Noch zwei Fragen:
a) ist das Ganze auch halbwegs schnell?
b) hat es einen Vorteil "like" statt "=" zu benutzen?

Uli
Zuletzt geändert von UliTs am Mo, 10. Jun 2013 13:52, insgesamt 1-mal geändert.
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Benutzeravatar
nightcrawler
1000 working lines a day
1000 working lines a day
Beiträge: 650
Registriert: Di, 24. Apr 2012 16:33
Wohnort: 72184 Weitingen
Hat sich bedankt: 3 Mal
Danksagung erhalten: 96 Mal
Kontaktdaten:

Re: SQL-Scripts

Beitrag von nightcrawler »

UliTs hat geschrieben:1) habe ich trotz der guten Dokumentation nicht rausbekommen...
nennt sich system variables in der Hilfe
a) ist das Ganze auch halbwegs schnell?
nicht schneller, als wenn das ganze statement schon fertig ist
b) hat es einen Vorteil "like" statt "=" zu benutzen?
dürfte auf dasselbe herauslaufen
--
Joachim
Joachim Dürr Softwareengineering
https://www.jd-engineering.de
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: SQL-Scripts

Beitrag von AUGE_OHR »

UliTs hat geschrieben:Aber Dein Lösungsansatz funktioniert so nicht.
Das Problem ist ja, dass ich an der Stelle die Feldnamen nicht kenne!
hm ... wenn ich eine Table öffne kann ich doch mit

Code: Alles auswählen

::cQuery := "SELECT * FROM %1 LIMIT 1"
::cQuery := STRTRAN( ::cQuery, "%1", ::cTable )
die Columne Namen ermitteln welche ich in einer Listbox darstelle deren Resultat einen String für die Var "cFields" darstellt.

um die "Structure" eine PostgreSQL Table zu ermitteln benutze ich diesen Code

Code: Alles auswählen

METHOD PGSql:dbStruct( cTable ) 
   ...
   ::exec( "SELECT column_name, data_type, character_maximum_length, numeric_precision, numeric_scale " + ;
           "FROM information_schema.columns WHERE table_name='" + cTable + "'" + ;
           "ORDER BY ordinal_position" )
UliTs hat geschrieben:Bei Deinem Ansatz gehst Du außerdem von nur einer Spalte und mehreren Zeilen aus.
Aber beim Ändern eines Datensatzes ist es genau umgekehrt: man hat (garantiert) nur eine Zeile, jedoch (im allgemeinen) mehrere Spalten...
nope ... es ist ein 2-Dim Resultset was ich auch zum browsen verwenden wenn die "cVar3" Variabel mit dem "MOVE" Befehl verwendet wird.
gruss by OHR
Jimmy
Antworten