2016-06-10 1 views
0

Un utilisateur ne peut modifier que les colonnes ST_ASSMT_NM et CAN_DT dans l'enregistrement ST_ASSMT_REF. Dans notre système, nous conservons l'historique dans la même table et nous ne mettons jamais vraiment à jour un enregistrement, nous insérons simplement une nouvelle ligne pour représenter l'enregistrement mis à jour. Par conséquent, l'enregistrement "actif" est l'enregistrement avec la plus grande valeur d'horodatage LAST_TS pour un VENDR_ID. Pour éviter la possibilité d'une mise à jour des colonnes qui ne peuvent pas être modifiées, j'ai écrit le UPDATE logique afin qu'il récupère les valeurs non modifiables de l'enregistrement d'origine et les copie vers le nouveau en cours de création. Pour les champs qui peuvent être modifiés, je les passe comme params,DB2: utilisation non valide de l'un des éléments suivants: un marqueur de paramètre non typé, le mot-clé DEFAULT ou une valeur nulle

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; 

Cependant, je reçois cette erreur:

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. 

Il semble que DB2 ne me permet pas d'utiliser une variable une instruction SELECT. Par exemple, lorsque je le fais dans TOAD pour DB2:

select 1, @vendorId from SYSIBM.SYSDUMMY1 

Je reçois une boîte de dialogue contextuelle. Lorsque je fournis une valeur de chaîne, j'obtiens la même erreur.

J'ai l'habitude d'utiliser SQL Server et je suis assez sûr que je n'aurais pas de problème à faire cela, mais je ne suis pas sûr de savoir comment le gérer.

Suggestions? Je sais que je pourrais le faire en deux commandes séparées, 1 interroger SELECT pour récupérer les valeurs d'origine et ensuite fournir les valeurs retournées et celles modifiées à la commande INSERT, mais je devrais être capable de faire des thios en un. Pourquoi je ne peux pas?

+0

J'ai dû convertir les variables @ pour correspondre aux types de données des colonnes cibles. – ChadD

+0

Impossible de poster ceci comme réponse. Je ne sais pas pourquoi ce site donne des erreurs si souvent. Cela ne se produit que lorsque j'utilise la machine de mon entreprise. – ChadD

Répondre

1

Comme vous l'avez mentionné dans votre commentaire, DB2 est très pointilleux sur les types de données, et il veut que vous transtypiez vos variables dans les bons types de données. Même si vous transmettez des valeurs NULL, DB2 souhaite parfois que la valeur NULL soit attribuée au type de données de la colonne cible.

Here est une autre réponse que j'ai sur le sujet.