2017-01-13 2 views
5

Je reçois une erreur qui peut être vu ci-dessous lorsque je prépare la requête:SQL: Échec de la préparation de la requête SQL. Mais est exécutée lorsque vous avez terminé manuellement

SQL-ERR:Preparation of INSERT Query Failed: Ora-Err: -1756 ORA-01756: 
quoted string not properly terminated 

La requête est la suivante:

EXEC SQL declare INSDTA STATEMENT; 
EXEC SQL PREPARE INSDTA FROM :stmt; 
if(sqlca.sqlcode < 0) 
{ 
    DEBUG_LOG("SQL-ERR:Preparation of INSERT Query Failed: Ora-Err: %d %s\n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc); 
    DEBUG_LOG("The Query is: %s\n", insertQuery); 
    return PREPARATION_FAILURE; 
} 

Et la requête de la le fichier journal est:

INSERT INTO TABLENAME 
VALUES (
    '00000001', 
    '00004467', 
    '0', 
    'R56565', 
    '03404395', 
    '20110601', 
    '999', 
    '87685785', 
    '2017-01-10-23.05.26.000000', 
    'KRMAR', 
    'KRMAR', 
    '77898878', 
    '03', 
    '00000001', 
    'U', 
    '01', 
    '1', 
    '87685785', 
    'R56565', 
    '89878988', 
    'cde', 
    'Andr\351', 
    '[email protected]', 
    '01192966', 
    'HGJF', 
    '00000000', 
    '', 
    '900429', 
    '1', 
    '98989897', 
    '', 
    'Aargau/Solothurn (CIC)', 
    'VCD', 
    'RB9', 
    'VCD', 
    'Observer' 
    ) 

Si je l'exécute manuellement, les données sont insérées.

Mais par programmation il échoue pour de nombreuses lignes de ce type.

Notez que le texte de saisie pour la requête d'insertion contient des caractères spéciaux tels que é, ü.

En outre, le même programme travaille parfaitement sur le système de développement. Mais sur la production, il échoue.

L'insertion manuelle fonctionne correctement sur la production.

Quel pourrait être le problème? Des problèmes de configuration?

Merci d'avance.

+1

pouvez-vous essayer null au lieu de chaînes vides? généralement deux citation pour oracle os pour échapper à une citation. – Walfrat

+0

d'accord, va essayer. Devinez-vous d'autres problèmes? – NJMR

+0

ne semble pas ainsi. – Walfrat

Répondre

3

Depuis \ est le caractère d'échappement, je pense que l'erreur vient de 'Andr\351' qui devrait probablement être 'André'.

Supprimez les caractères antislash de votre requête juste pour vérifier si c'est la cause réelle.

+0

Mais la même requête fonctionne sur le système local. Laissez vérifier les journaux dans le système de développement local sur la façon dont les caractères spéciaux sont traités. Je reviendrai à vous à ce sujet. Merci pour la réponse. – NJMR

+0

@NJMR il se peut que vous ne soyez pas connecté avec les mêmes paramètres/configuration (utilisateur, paramètres de chaîne de connexion, etc.) –

2

Il existe une différence fondamentale entre l'exécution manuelle d'une requête et l'utilisation de SQL dynamique pour préparer une requête avec des variables de liaison pour exécuter plusieurs fois avec des paramètres différents.

Voici un bon aperçu de Dynamic SQL Statements. Ce que vous trouverez peut-être particulièrement utile est la section sur la préparation d'instructions SQL dynamiques - en particulier les détails sur les espaces réservés dans Oracle et la section sur l'exécution d'instructions SQL dynamiques.

Il est difficile de dire quel pourrait être le problème sans voir l'instruction SQL dynamique que vous utilisez et comment vous déclarez vos espaces réservés.

Quelques pointeurs:

  • Il semble que vous utilisez une variable en essayant d'insérer plusieurs valeurs. Dans Oracle, au moment où l'instruction est exécutée, il doit y avoir une variable pour chaque espace réservé.

  • La procédure que vous montrez est incomplète.

    • À quoi ressemble la requête dans :stmt?
    • À quoi ressemblent vos espaces réservés? Les cordes sont-elles correctement citées?
    • Quelles sont les valeurs des variables que vous utilisez pour les espaces réservés?

    • Votre déclaration manque END-EXEC

Exemple tiré au-dessus de la source:

move "INSERT INTO publishers " & 
      "VALUES (?,?,?,?)" to stmtbuf 
EXEC SQL 
    PREPARE stmt1 FROM :stmtbuf 
END-EXEC 
    ... 
EXEC SQL 
    EXECUTE stmt1 USING :pubid,:pubname,:city,:state 
END-EXEC 
0

supprimer tout (» «) à partir des valeurs intégrales

0

Votre requête est en train d'échouer car l'espacement e dans la colonne Aargau/Soleure (CIC). Backspace est un caractère spécial, vous devez donc prendre soin d'utiliser backspace ou supprimer du tout. Ensuite, vous serez en mesure de l'exécuter avec succès.