![]() |
Datenbank: Informix • Version: 7SE • Zugriff über: Luxena
Ein paar SQL Fragen ( stored procedure )
Moin,
1. Wie schreibe ich am elegantesten eine Abfrage in einer stored procedure, ob select etwas zurück geliefert hat. z.b die Anzahl der Reihen? Mir geht es darum eine Weich in einer SP zu programmieren die entscheidet ob der Datensatz aktualisiert werden soll, oder neu hinzugefügt werden muss. 2. Wie kann ich einen String aufbereiten? Vergleichbar mit format() oder sprintf(). Mir geht es hier darum das ich aus der Zahl 1 den String "01" bekomme. 3. Wie wandel ich Zeichen in eine Zahl. Wie z.b unter C mit atoi()? Sorry sind sicherlich stupide fragen, aber bin absoluter SQL Neuling. Hab hier zig Bücher um mich herumliegen und komme eigentlich ganz gut klar, aber an einigen Kleinigkeiten hängt es dann. Sven |
Re: Ein paar SQL Fragen ( stored procedure )
Hallo,
zu 1.) Ich löse das immer so, dass ich die Datensätze über die ID identifiziere. Beim Speichern übergebe ich die ID an die SP, wenn die ID > 0 ist, dann wird ein Update durchgeführt und wenn eben ID = 0 ist, dann wird ein neuer DS angelegt.
SQL-Code:
(if ID = 0 Then)
begin Insert into ..... select Gen_ID(DB_Gen_ID,1) From RDB$database Into :ID end else begin Update DB Set .... WHERE ID = ID end; |
Re: Ein paar SQL Fragen ( stored procedure )
Wenn ich ehrlich bin verstehe ich das nicht ganz.
Was ist ID? Du meinst den eindeutigen Schlüssen in der Tabelle oder? Sprich ich mach ein Select auf einen Datensatz wo ich mir nur den Eindeutigen Schlüssen zurückgeben lasse und frage diesen ab. Muss ich mal antesten. Übrigens ich spreche nur von SQL Code, nicht von Abfragen in Pascal. Dein Code schaut mir sehr Pascal lastig mit begin und end im if Zweig aus. Vielen dank für die Antwort. Sven |
Re: Ein paar SQL Fragen ( stored procedure )
Hallo,
ich kann mich jetzt auch irren aber ich glaube Du hast mich nicht verstanden. Wenn Du dein Prog startest ist die ID (Primarykey aus der DB) = 0, da ja noch kein Datensatz ausgewählt wurde. Wenn Du nun eine Datensatz auswählst, übergibst Du auch den die ID (PK). Somit weist Du schonmal ob der Datensatz neu ist oder schon bereits existiert. Die If-Abfrage ist das einzigste was mit Pascal zutun hat, der Rest ist doch reines SQL, oder nicht? :gruebel: Wenn Du keine If-Abfrage haben willst, dann must Du vorher ein Select abschicken und das Ergebnis auswerten. Aber ich habe mich damit mal angeschmiert und bevorzuge daher diese Variante. Aber das ist ja jedem selber überlassen wie man regelt. Es gib bestimmt auch noch andere Wege, als die beiden hier zur Auswahl stehenden Varianten. |
Re: Ein paar SQL Fragen ( stored procedure )
Die ID wird verwendet zur Identifizierung eines Records, ohne hierfür ein eventuell sogar vom User veränderbares Feld zu nehmen, z.B. die Art.Nr. Das führt aber jetzt zu weit. Was Albi da schreibt ist aber grober Unfug !! Der Wert des Generators enthält nie und nimmer die Anzahl der Reihen einer Table sofern auch nur ein Datensatz gelöscht wird ! Um es mal ganz klar zu sagen. Der Generatorwert ist völlig uninteressant, um Information damit zu verwalten. Gerade bei der ID geht es genau darum, es nicht so zu machen. Das Pascal-ähnliche ist aber doch auch gut so oder nicht ? Das Albi-Beispiel kommt mir übrigens sehr bekannt vor. Hatte mal irgendwann gepostet, wie man die DB automatisch entscheiden läßt, ob Insert oder Update gemacht werden muß. Allerdings, dafür eine Systabelle zu benutzen ? :shock:
|
Re: Ein paar SQL Fragen ( stored procedure )
Hallo Hansa,
Das was ich hier beschrieben habe bezieht sich auf das hier Zitat:
|
Re: Ein paar SQL Fragen ( stored procedure )
Ah ja, habe ich vor Entsetzen gar nicht gesehen. :mrgreen: Trotzdem : Finger weg von den Systemtabellen wenn es anders auch geht ! Genau das werden nämlich die Programme, die bei einem Wechsel der Datenbank-Version plötzlich nicht mehr gehen. Das ist ähnlich zu sehen, wie die beliebten Programme, die direkt auf die WinApi zugreifen.
|
Re: Ein paar SQL Fragen ( stored procedure )
Ne moment. Mein Programm soll darauf gar keine Berücksichtigung finden.
D.h das soll alles komplett losgelöst von der Applikation sein. Ich möchte der Stored Procedure auch nicht mitgeben ob es ein insert oder update fahren soll, sondern das soll ganz alleine die SP entscheiden. Was ich eigentlich nur benötige ist, das ich in der SP durch ein select oder sonst etwas heraus bekommen wieviele Datensätze (rows) das select gefunden hat. Dadurch soll entschieden werden ob ein insert oder update ausgeführt werden soll. Sven |
Re: Ein paar SQL Fragen ( stored procedure )
Zitat:
Zitat:
Sofern jeder DS eine eindeutige Nr. hat, dann brauchst Du nur... Beispiel ist besser:
SQL-Code:
Es geht um eine Kunden-Preistable. Hat ein Kunde für einen Artikel einen Preis, so ist die ID <> 0 => Update. Ist keiner da, dann bleibt Aendern auf -1 stehen und es wird ein Insert gemacht. Bingo !
CREATE PROCEDURE PREISSP (
ID_KUNDE INTEGER, VP DECIMAL(15,2), ID_ART INTEGER) AS DECLARE VARIABLE AENDERN INTEGER; begin AENDERN = -1; select ID from PREIS where (ID_KUNDE= :ID_KUNDE) and (ID_ART= :ID_ART) into :AENDERN; if (AENDERN < 0) then begin insert into PREIS (ID_KUNDE,ID_ART,VP) values (:ID_KUNDE,:ID_ART,:VP); end else begin update PREIS set VP=:VP where (ID_ART= :ID_ART) and (ID_KUNDE= :ID_KUNDE); end suspend; end |
Re: Ein paar SQL Fragen ( stored procedure )
das ist mal ne Antwort :-)
Das ganze muss also mit INTO stattfinden. Ich dachte eher an :
Delphi-Quellcode:
Aber knapp vorbei ist auch daneben.
let c = (select * from x where y = z);
Was mich eben etwas verwirrt hat war das if ... then begin ... end In meiner schlauen Informix SQL Guide steht etwas von if then ... end if Zu meinen zwei anderen Fragen hast aber keine Antwort parat oder? Sven |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:32 Uhr. |
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