Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Ein paar SQL Fragen ( stored procedure ) (https://www.delphipraxis.net/48092-ein-paar-sql-fragen-stored-procedure.html)

Hansa 21. Jun 2005 18:46

Re: Ein paar SQL Fragen ( stored procedure )
 
Ne, keine Antwort. 8) Du wirst doch wohl wissen, ob das Programm eine Zahl oder einen string aus der DB erwartet ? Und das mußt du der auch mitteilen !

Sven Janssen 21. Jun 2005 19:07

Re: Ein paar SQL Fragen ( stored procedure )
 
Was?
Bitte nicht hinterfragen, ich denke mir schon meinen Teil dabei ;-)
Es geht nicht um Werte die ich aus oder in die SQL Tabelle schreibe, sondern um Schlüssel die ich in den Stored Procedures aufbereiten muss.
Ich habe SQL in a Nutshell von o'reilly. Ich kann Sinus, Cosinus und sonstwas in einigen SQL Datenbanksystemen aufbereiten. Aber simple Dinge finde ich nicht.

Die Datenstruktur auf die ich Zugreife ist Asbach Uralt. Aber diese kann nicht erneuert werden, da sonst über 100 Programme mit Millionen Zeilen von Code geändert werden müssen. Nun soll von _aussen_ Windows Programme über Informix auf die Daten zugreifen. Auch alles kein Problem. Aber die Datenstrukturen sind nicht wirklich SQL tauglich. ( die Stammen noch aus Altos Zeiten ;-) falls dir das was sagt *hehe*)

Ich muss in der SP also Schlüssel aufbereiten nach dem System "nummer+laufende Positon" . z.b 1000001 bis 1000099
Aber wie soll ich das ohne sprintf/format elegant lösen? Ich könnte das zwar alles im Programmcode lösen, aber dann verursache ich unnötigen Traffic den ich vermeiden möchte, da die Programme nachher über <1MBit Standleitungen laufen sollen.

So pervers das nun anzuschauen sein soll müsste ich so etwas in der Art lösen ( code so aus dem Kopf geschrieben )
Delphi-Quellcode:
found = -1;
for i = 0 to 99 do
  key = format('%s%.02d',[suche,i]); -- das suche ich in SQL
  select nummer from table where nummer = key into erg
  if erg <= 0 then
    found = i;
    exit for;
  end if
end for
if found > 0 then
  -- Luecke gefunden nun neuen Datensatz in luecke einfuegen
end if
Bitte nicht über den Sinn diskutieren ;-) einfach so hinnehmen

Sven

marabu 21. Jun 2005 19:52

Re: Ein paar SQL Fragen ( stored procedure )
 
Hallo Sven,

ich habe keine Ahnung was Informix kann, aber ich würde etwa so vorgehen:

Du übergibst neben den Feldwerten noch deinen Suchbereich sb an deine Stored Procedure. In deinem Beispiel wäre sb = 10000. In deiner SP würdest du als erstes die Grenzen deines Suchbereiches festlegen:

SQL-Code:
lBound = :sb * 100 + 1
uBound = :sb * 100 + 98
Anschließend kannst du einen Cursor definieren für:

SQL-Code:
DECLARE c CURSOR FOR
SELECT nummer + 1 AS freienummer FROM tabelle o
WHERE o.nummer between lBound and uBound
AND NOT EXISTS (
  SELECT i.nummer FROM tabelle i WHERE i.nummer = o.nummer + 1
)
Dieser Cursor listet dir alle freien Nummern im Range ...01 bis ...99, aber du kannst eventuell den result set auf ein singleton limitieren.

Grüße vom marabu

Sven Janssen 21. Jun 2005 19:58

Re: Ein paar SQL Fragen ( stored procedure )
 
das schaut nett und viel versprechend aus.
Werde ich morgen früh direkt man austesten.

Danke :-)

Sven

Sven Janssen 22. Jun 2005 13:20

Re: Ein paar SQL Fragen ( stored procedure )
 
Toll. Informix 7 SE bekommt es nicht hin Cursors zu benutzen.
So wie das ausschaut geht das nur über ESQL und dieses wird nur über direkte Zugriffe über deren eigenen Schnittstellen gelöst :-(

Zumindestens lösen DECLARE PREPARE usw nur Syntax Erros aus.

Sven

marabu 22. Jun 2005 14:11

Re: Ein paar SQL Fragen ( stored procedure )
 
Hallo Sven,

ist es nicht so, dass du eine stored procedure in Informix SPL erstellen musst? Aus einem Handbuch habe ich das hier:

SQL-Code:
CREATE_PROCEDURE increase_by_pct( pct INTEGER )
   DEFINE s INTEGER;
   FOREACH sal_cursor FOR
      SELECT salary INTO s FROM employee
         WHERE salary > 35000
      LET s = s + s * ( pct/100 );
      UPDATE employee SET salary = s
         WHERE CURRENT OF sal_cursor;
   END FOREACH
END PROCEDURE;
Sieht doch gar nicht so schlimm aus...

marabu

Sven Janssen 22. Jun 2005 14:36

Re: Ein paar SQL Fragen ( stored procedure )
 
Das funktioniert tatsächlich.
Aber laut Informix SQL Guide und Informix SQL Referenz sollte das eher so

Delphi-Quellcode:
declare c_master cursor with hold for
select customer_num from customer where city = 'Pittsburgh';
oder
Delphi-Quellcode:
prepare st_1 from
    'select order_date from orders where customer_num = ? for update';
declare c_detail cursor for st_1;
so ausschauen.

Und beide Varianten gehen mittel dbaccess nicht.

Sven


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:15 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz