Announcement

Collapse
No announcement yet.

Unerklärlicher Fehler bei Insert in einer SP

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Unerklärlicher Fehler bei Insert in einer SP

    Hallo,
    in einer Stored Procedure soll bei Bedarf ein Datensatz eingefügt werden. Beim Test in IBConsole (IB 7.5) erhalte ich folgende Fehlermeldung:
    <i>validation error for column ID value "*** null ***"</i>
    Diesen Fehler kann ich mir nicht erklären:
    ** Das Feld ID ist per Domain als 'Default 0 not null' deklariert.
    ** In den Eigenschaften der Tabelle wird dies bestätigt.
    ** Durch die SP wird der Variablen Neue_ID auf jeden Fall ein Wert zugewiesen, wie folgender Quelltext-Auszug zeigt:
    ---------------------------
    SELECT Zahl2
    FROM Einstellungen
    WHERE Bezeichnung = 'Programm'
    INTO :i1;
    IF ( i1 = 0 )
    THEN d1 = '31.12.2999';
    ELSE BEGIN
    IF ( i1 IS NULL)
    THEN i1 = 30;
    d1 = CAST('NOW' AS DATE) + i1;
    END
    /* gewuenschte ID holen
    IF ( Nr IS NULL )
    THEN Neue_ID = GEN_ID( Nutzer_id, 1 );
    ELSE Neue_ID = :Nr;
    /* Datensatz speichern */
    INSERT INTO Nutzer
    ( ID, Bezeichnung, Passwort_Geltung )
    Values ( :Neue_ID, :Name, :d1 );
    Inhalt = :Name || ' neu aufgenommen';
    --------------------------
    Was kann hier los sein?
    <b>Nachtrag</b> Kann es sein, dass IBConsole die Default-Werte nicht automatisch setzt? Diesen Eindruck habe ich, wenn ich einen Datensatz im DataGrid einer Tabelle manuell speichere.
    Danke für Tipps!
    <b>Im Übrigen wünsche ich ein gesundes Jahr 2006.</b>
    Jürgen

  • #2
    Jürgen,

    vielleicht solltest Du mal die Handbücher lesen.
    Default-Werte werden *NUR* eingetragen, wenn das Feld *NICHT* Bestandteil des Insert-Statements ist.

    create table test (
    test_id integer not null,
    test_def integer default 1)

    insert into test values ( 1, 1 );
    insert into test ( test_id ) values ( 2 );
    insert into test ( test_id, test_def ) values ( 3, NULL );

    führt zu:
    test_id test_def
    1 1
    2 1
    3 null

    Wenn das Feld als NOT NULL definiert ist, nutzt Dir auch ein Default Value nix.

    Luc

    Comment


    • #3
      Luc,
      das war mir so nicht bewusst. (Nicht alles, was in den Handbüchern steht, bleibt schnell genug hängen.)
      Dieses Verhalten ist vielleicht die Erklärung für das Speichern in IBConsole. Es kann aber bei mir nicht das Problem sein: Durch die unmittelbar vorhergehende Abfrage und Zuweisung muss der Parameter <b>Neue_ID immer</b> mit einem Wert belegt sein. Also kann das Feld ID eigentlich niemals NULL sein.
      Was ist also wirklich los

      Comment


      • #4
        Nein muss es nicht.
        Wenn Du ein SELECT auf einen Record machst, den es NICHT gibt, dann ist der Wert nicht NULL sondern NIX.
        NULL ist ein unbekannter Wert (wird auch oft als Status bezeichnet), aber nicht NIX.
        In diesem Falle musst Du in der StoredProcedure dafür Sorge tragen, den Wert vorher immer mit NULL zu initialisieren.

        Luc

        Comment


        • #5
          Luc,
          danke für diesen weiteren Hinweis. Nach meinen bisherigen Tests hatte ich genau das angenommen, dass Interbase auf diese Weise den Parameter mit NULL (automatisch nachträglich) initialisiert.
          Allerdings löst auch das nicht mein Problem; denn in meinem Fragment ist 'Nr' ein input-Parameter, der auf diese Weise immer initialisiert ist (entweder ausdrücklich mit NULL oder mit einem Wert).
          Also nochmals: was ist los?
          Jürge

          Comment


          • #6
            Hallo Jürgen,<p>
            wenn du keinen SP-Debugger hast, dann übergebe die Insert-Parameter doch mal als Return-Parameter und mache aus der SP eine selectible.<p<
            Das Übergeben erfolgt dann mit commit; vor dem Insert
            <p>
            Alternativ kannst du auch ne logging tabelle benutzen

            <p>
            Heik

            Comment


            • #7
              Danke für alle Hinweise,
              jetzt ist mir der Fehler aufgefallen (und auch alle Helfer hatten ihn überlesen):
              Bei dem Kommentar <b>/* gewuenschte ID holen </b> habe ich den Abschluss <b>*/</b> vergessen.
              Ach je, was alles so passieren kann...
              Jürge

              Comment


              • #8
                Hallo Jürgen,
                und Dein Entwicklungstool zeigt Dir nicht automatisch (z.B. andere Schriftfarbe), dass der Rest dann eigentlich als Kommentar angesehen wird? Ich verwende für einzeilige Kommentare eigentlich immer ein <b>//</b>
                <br>
                Thoma
                Thomas Steinmaurer

                Firebird Foundation Committee Member
                Upscene Productions - Database Tools for Developers
                Mein Blog

                Comment


                • #9
                  Hallo Thomas,

                  da ich mich zz. fast ausschließlich mit den SQL-Skripts für die Entwicklung der Datenbanken befasse, verzichtete ich auf Delphi, sondern habe überwiegend den einfachen Windows-Editor verwendet. (Der Editor von IBConsole analysiert zwar die Texte, aber er ist doch zu einfach gestrickt.)

                  Ich werde nach den obigen Erfahrungen (und Deiner Nachfrage) nun doch ein banales Delphi-Projekt generieren und die Delphi-IDE als Editor benutzen.

                  Jürge

                  Comment

                  Working...
                  X