2016-06-10 4 views
0

Ein Benutzer kann nur die ST_ASSMT_NM- und CAN_DT-Spalten im ST_ASSMT_REF-Datensatz ändern. In unserem System behalten wir den Verlauf in der gleichen Tabelle und wir aktualisieren nie wirklich einen Datensatz. Wir fügen einfach eine neue Zeile ein, um den aktualisierten Datensatz darzustellen. Als Ergebnis ist der "aktive" Datensatz der Datensatz mit dem größten LAST_TS-Zeitstempelwert für eine VENDR_ID. Um die Möglichkeit einer Aktualisierung auf Spalten zu verhindern, die nicht geändert werden können, habe ich das logische UPDATE geschrieben, so dass es die nicht veränderbaren Werte aus dem ursprünglichen Datensatz abruft und sie in den neuen Datensatz kopiert, der gerade erstellt wird. Für die Felder, die geändert werden können, gebe ich sie als params,DB2: ungültige Verwendung einer der folgenden: eine untypisierte Parametermarkierung, das Schlüsselwort DEFAULT oder ein Nullwert

INSERT INTO GSAS.ST_ASSMT_REF 
(
     VENDR_ID 
    ,ST_ASSMT_NM 
    ,ST_CD 
    ,EFF_DT 
    ,CAN_DT 
    ,LAST_TS 
    ,LAST_OPER_ID 
) 
SELECT 
     ORIG_ST_ASSMT_REF.VENDR_ID 
    ,@ST_ASSMT_NM 
    ,ORIG_ST_ASSMT_REF.ST_CD 
    ,ORIG_ST_ASSMT_REF.EFF_DT 
    ,@CAN_DT 
    ,CURRENT TIMESTAMP 
    ,@LAST_OPER_ID 
FROM 
     (
       SELECT 
         ST_ASSMT_REF_ACTIVE_V.VENDR_ID 
         ,ST_ASSMT_REF_ACTIVE_V.ST_ASSMT_NM 
         ,ST_ASSMT_REF_ACTIVE_V.ST_CD 
         ,ST_ASSMT_REF_ACTIVE_V.EFF_DT 
         ,ST_ASSMT_REF_ACTIVE_V.CAN_DT 
         ,CURRENT TIMESTAMP 
         ,ST_ASSMT_REF_ACTIVE_V.LAST_OPER_ID 
       FROM 
         G2YF.ST_ASSMT_REF_ACTIVE_V ST_ASSMT_REF_ACTIVE_V --The view of only the most recent, active records 
       WHERE 
         ST_ASSMT_REF_ACTIVE_V.VENDR_ID = @VENDR_ID 
     ) ORIG_ST_ASSMT_REF; 

Allerdings erhalte ich diese Fehlermeldung:

DB2 SP 
: 
ERROR [42610] [IBM][DB2] SQL0418N The statement was not processed because the statement contains an invalid use of one of the following: an untyped parameter marker, the DEFAULT keyword, or a null value. 

Es scheint, als ob DB2 wird mir nicht erlauben, eine Variable zu verwenden, in eine SELECT-Anweisung Zum Beispiel, wenn ich dies in TOAD für DB2 mache:

Ich bekomme ein Popup-Dialogfeld. Wenn ich einen String-Wert zur Verfügung stelle, bekomme ich den gleichen Fehler.

Ich benutze normalerweise SQL Server und ich bin ziemlich sicher, dass ich kein Problem dabei hätte, aber ich bin nicht sicher, wie man damit umgeht.

Vorschläge? Ich weiß, dass ich das in zwei separaten Befehlen machen könnte, 1 frage SELECT, um die ursprünglichen VALUES zu erhalten, und gebe dann die zurückgegebenen Werte und die modifizierten Werte an den INSERT-Befehl weiter, aber ich sollte Thios in einem tun können. Warum kann ich nicht?

+0

Ich musste die @ Variablen umwandeln, um die Datentypen der Zielspalten zu entsprechen. – ChadD

+0

Kann nicht als Antwort gepostet werden. Ich weiß nicht, warum diese Seite so oft Fehler gibt. Es tritt nur auf, wenn ich die Maschine meiner Firma benutze. – ChadD

Antwort

1

Wie Sie in Ihrem Kommentar erwähnt haben, ist DB2 sehr wählerisch bei Datentypen und möchte, dass Sie Ihre Variablen in die richtigen Datentypen umwandeln. Auch wenn Sie NULLs übergeben, möchte DB2 manchmal, dass Sie NULL auf den Datentyp der Zielspalte übertragen.

Here ist eine andere Antwort, die ich auf das Thema habe.

Verwandte Themen