AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Variable in Function

Ein Thema von Nersgatt · begonnen am 23. Jun 2014 · letzter Beitrag vom 24. Jun 2014
Antwort Antwort
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.381 Beiträge
 
Delphi 12 Athens
 
#1

AW: Variable in Function

  Alt 23. Jun 2014, 07:33
Du suchst also eine Lösung für das "INSERT OR UPDATE"-Problem?

Bei Google suchenMySQL INSERT OR UPDATE
http://dev.mysql.com/doc/refman/5.1/...duplicate.html


Postgre SQL kennt z.B. die Variable FOUND, welche auf True steht, wenn z.B. ein vorheriges Update mindestens einen Datensatz "fand".
Eventuell hat mySQL auch sowas oder was Ähnliches?
SQL-Code:
UPDATE db SET b = data WHERE a = key;
IF not FOUND THEN
  INSERT INTO db (a, b) VALUES (key, data);

Oder man macht sich selber soeine Variable, wenn die vorhandene Variable (hier @Result) kein passendes Ergebnis liefert.
SQL-Code:
declare result int;
declare jupp bool;
select SEQUENCE_VALUE, true into @result, @jupp from openjpa_sequence_table where id = 0;
if jupp is null then
  insert ...
else
  update ..
PS: Was passiert wohl, wenn zwischen dem SELECT und dem INSERT/UPDATE jemand Anderes ein INSERT/UPDATE macht?
Oder führt MySQL diese FUNCTION quasi atomar aus, so daß kein Anderer zur selben Zeit was an der Tabelle machen kann?
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (23. Jun 2014 um 07:59 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von gravedigger
gravedigger

Registriert seit: 10. Mai 2007
Ort: Kamen
16 Beiträge
 
Delphi XE5 Professional
 
#2

AW: Variable in Function

  Alt 23. Jun 2014, 08:11
Hallo Nersgat,

warum deklarierst du eine Variable Result und benutzt sie dann nicht?
Code:
CREATE DEFINER=`root`@`localhost` FUNCTION `get_next_id`() RETURNS int(11)
BEGIN

declare result int;

   select SEQUENCE_VALUE into result from openjpa_sequence_table where id = 0;

   if (result is null) then
      SET result := 1;
      insert into openjpa_sequence_table (ID, SEQUENCE_VALUE) VALUES (0, result);
   else  
      SET result := result+1;
      update openjpa_sequence_table
      set SEQUENCE_VALUE = result
      where ID = 0;
   end if;

   RETURN result;
END
sollte funktionieren.

Und wenn du jetzt noch ein Select auf die Funktion und nicht auf eine Variable machst sollte es erst recht funktionieren
Code:
select get_next_id();
Gruß aus Dortmund
Frank

Geändert von gravedigger (23. Jun 2014 um 08:36 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Nersgatt
Nersgatt

Registriert seit: 12. Sep 2008
Ort: Emlichheim
693 Beiträge
 
Delphi 10.1 Berlin Professional
 
#3

AW: Variable in Function

  Alt 23. Jun 2014, 08:38
Erst einmal danke für die Antworten!

@gravedigger: ich dachte, das hätte ich getan?
Wie würde ich den die von mir declarierte Variable referenzieren?
Jens
  Mit Zitat antworten Zitat
Benutzerbild von gravedigger
gravedigger

Registriert seit: 10. Mai 2007
Ort: Kamen
16 Beiträge
 
Delphi XE5 Professional
 
#4

AW: Variable in Function

  Alt 23. Jun 2014, 08:48
Hallo Nersgatt,

die Variable @result ist eine Benutzervariable und muss nicht deklariert werden.
Sie behält ihren Wert solange wie die MySQL-Session geöffnet ist und nicht überschrieben wird.

So wie die Variable deklariert wurde sollte man sie auch benutzen
Code:
DECLARE result int;
SET result := result+1;
Gruß aus Dortmund
Frank
  Mit Zitat antworten Zitat
Benutzerbild von Nersgatt
Nersgatt

Registriert seit: 12. Sep 2008
Ort: Emlichheim
693 Beiträge
 
Delphi 10.1 Berlin Professional
 
#5

AW: Variable in Function

  Alt 23. Jun 2014, 08:56
Ah, mir war das Konzept dieser Benutzervariablen nicht geläufig. Das erklärt meine Fehler.
Jetzt funktioniert es so wie gewünscht!

@Dejan Vu: Deinen Hinweis hab ich natürlich auch gesehen und Du hast natürlich recht.

Danke!
Jens
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#6

AW: Variable in Function

  Alt 23. Jun 2014, 11:32
Fein, und ich hab was über mysql gelernt.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#7

AW: Variable in Function

  Alt 23. Jun 2014, 11:55
Also abgesehen davon, daß
Code:
declare result int;
hier überfüssig ist
Code:
CREATE DEFINER=`root`@`localhost` FUNCTION `get_next_id`() RETURNS int(11)
 BEGIN
 declare result int;
 
   select SEQUENCE_VALUE into @result from openjpa_sequence_table where id = 0;
 
   if (@result is null) then
       SET @result := 1;
       insert into openjpa_sequence_table (ID, SEQUENCE_VALUE) VALUES (0, 1);
    else  
       update openjpa_sequence_table
       set SEQUENCE_VALUE = SEQUENCE_VALUE + 1
       where ID = 0;
    end if;
 
   RETURN @result + 1;
 END
sollte doch mit einem
Code:
select get_next_id ....
alles funktionieren, oder hab ich da etwas falsch verstanden?

Gruß
K-H

P.S. soetwas wie SQUENCES oder AUTOINC gibt es in MySQL nicht?
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:21 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-2025 by Thomas Breitkreuz