Delphi-PRAXiS
Seite 4 von 6   « Erste     234 56      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Was mache ich falsch? Firebird rattert wie irre auf der HDD (https://www.delphipraxis.net/93696-mache-ich-falsch-firebird-rattert-wie-irre-auf-der-hdd.html)

hoika 11. Jun 2007 09:48

Re: Was mache ich falsch? Firebird rattert wie irre auf der
 
Hallo,

was passiert, wenn du z.B. nur 100 Einträge in die DB packst,
rattert der dann genauso ?

Wie sieht es bei dem Server mit dem RAM und RAM-Verbrauch von FB aus ?


Heiko

Gecko 11. Jun 2007 10:45

Re: Was mache ich falsch? Firebird rattert wie irre auf der
 
Zitat:

Zitat von hoika
Hallo,
was passiert, wenn du z.B. nur 100 Einträge in die DB packst,
rattert der dann genauso ?
Wie sieht es bei dem Server mit dem RAM und RAM-Verbrauch von FB aus ?
Heiko

Nein, bei 100 Einträgen rattert nichts, ich konnte das ganze ja auch durch die freundliche Hilfe von mkinzler und co soweit in den Griff kriegen.
Was ich aber noch bräuchte ist eine Übersetzung von

Code:
INSERT INTO SPAM (WORD,ANZAHL) VALUES ('TEST',0) ON DUPLICATE KEY UPDATE ANZAHL=ANZAHL+1;
in die Syntax von Firebird 2.1, also irgendwie sowas:

Code:
UPDATE OR INSERT INTO <table or view> [(<column_list>)]
VALUES (<value_list>)
[MATCHING <column_list>]
[RETURNING <column_list> [INTO <variable_list>]]
Das peil ich nämlich nicht so ganz ;)

MrSpock 11. Jun 2007 11:39

Re: Was mache ich falsch? Firebird rattert wie irre auf der
 
Hallo Gecko,

alex517 hat dir in seinem Beitrag auf der ersten Seite dieses Threads eine StoredProcedure vorgestellt, die automatisch ein UPDATE anstelle eines INSERT durchführt, wenn der Schlüssel schon existiert. Diese kannst du benutzen, denn die funktioniert bei ellen FB Versionen. So mache ich es bei ähnlicher Problemstellung auch immer. :stupid:

Gecko 11. Jun 2007 11:45

Re: Was mache ich falsch? Firebird rattert wie irre auf der
 
Zitat:

Zitat von MrSpock
Hallo Gecko,

alex517 hat dir in seinem Beitrag auf der ersten Seite dieses Threads eine StoredProcedure vorgestellt, die automatisch ein UPDATE anstelle eines INSERT durchführt, wenn der Schlüssel schon existiert. Diese kannst du benutzen, denn die funktioniert bei ellen FB Versionen. So mache ich es bei ähnlicher Problemstellung auch immer. :stupid:

Wie rufe ich die denn auf?
Ist die ganze Procedure das dann meine SQL Query? also Zeosquery.SQL.text:=Code von Alex?

MrSpock 11. Jun 2007 11:47

Re: Was mache ich falsch? Firebird rattert wie irre auf der
 
Hallo Gecko,

nein, eine SP wird in der Datenbank gespeichert und direkt auf dem Server ausgeführt. Ich benutze kein Zeos, aber gibt es dort keine Komponente für die Verbindung mit StoredProcedures? Eine solche Komponente hat dann in der Regel eine Methode wie "Execute".

mkinzler 11. Jun 2007 11:55

Re: Was mache ich falsch? Firebird rattert wie irre auf der
 
TZStoredProc oder halt einen Query

Gecko 11. Jun 2007 15:28

Re: Was mache ich falsch? Firebird rattert wie irre auf der
 
Ich hab die StoredProc von Alex jetzt (leicht abgeändert) in IBExpert probiert:

Tabellenaufbau:
Word | Anzahl
Primary Key
Indiziert

SQL-Code:

CREATE PROCEDURE SP_SPAM_IU (
    word varchar(30))
returns (
    anzahl integer)
as

BEGIN
  SELECT WORD, ANZAHL FROM SPAM WHERE (WORD = :WORD) INTO :WORD, :ANZAHL;
  IF (WORD is not NULL) THEN
  BEGIN
    UPDATE SPAM SET ANZAHL = :ANZAHL +1 
    WHERE (WORD = :WORD);
  END ELSE
  BEGIN
    INSERT INTO SPAM ( 
        WORD,
        ANZAHL)
    VALUES ( 
        :WORD,
        1);
    ANZAHL = 1;
  END

  SUSPEND;
END
Es kommt dann beim Ausführen auch ein Abfragefeld für den Parameter (Word), allerdings ist der Rückgabeparameter (anzahl) der mir dann angezeigt wird immer NULL
und in die Tabelle wird auch nichts eingefügt

hoika 11. Jun 2007 15:44

Re: Was mache ich falsch? Firebird rattert wie irre auf der
 
Hallo,

der Parameter Word wird überschrieben.
Ist nie ne gute Idee, einen Parameter als Variable zu missbrauchen

mal so hingetippert.

SQL-Code:
CREATE PROCEDURE SP_SPAM_IU (
    word varchar(30))
returns (
    anzahl integer)
as
  declare variable LocalWord varchar(30);
BEGIN
  SELECT WORD, ANZAHL FROM SPAM WHERE (WORD = :WORD) INTO :LocalWord, :ANZAHL;
  IF (LocalWord is not NULL) THEN
  BEGIN
    UPDATE SPAM SET ANZAHL = :ANZAHL +1
    WHERE (WORD = :WORD);

    Anzahl = Anzahl +1;
  END ELSE
  BEGIN
    INSERT INTO SPAM (
        WORD,
        ANZAHL)
    VALUES (
        :LocalWord,
        1);
    ANZAHL = 1;
  END

  SUSPEND;
END

Heiko

Gecko 11. Jun 2007 15:52

Re: Was mache ich falsch? Firebird rattert wie irre auf der
 
@hoika

Jetzt kommt leider "The insert failed because a column definition includes validation constrains.
validation error for column WORD, value ***NULL***

:wall:

mkinzler 11. Jun 2007 15:54

Re: Was mache ich falsch? Firebird rattert wie irre auf der
 
Im 2. Fall ist ja localWord leer, da Word nehmen:
SQL-Code:
CREATE PROCEDURE SP_SPAM_IU (
    word varchar(30))
returns (
    anzahl integer)
as
  declare variable LocalWord varchar(30);
BEGIN
  SELECT WORD, ANZAHL FROM SPAM WHERE (WORD = :WORD) INTO :LocalWord, :ANZAHL;
  IF (LocalWord is not NULL) THEN
  BEGIN
    UPDATE SPAM SET ANZAHL = :ANZAHL +1
    WHERE (WORD = :WORD);

    Anzahl = Anzahl +1;
  END ELSE
  BEGIN
    INSERT INTO SPAM (
        WORD,
        ANZAHL)
    VALUES (
        :Word,
        1);
    ANZAHL = 1;
  END

  SUSPEND;
END


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:49 Uhr.
Seite 4 von 6   « Erste     234 56      

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