Dans le cadre d’une application basée sur Plone et Oracle, de nombreuses fonctionnalités ne fonctionnaient plus du jour au lendemain, sans aucune raison particulière. L’exécution de certaines ZSQL Methods faisant appel à des procédures stockées dans Oracle étaient en erreur ORA-06550 ! Des heures de debug avec le client avant de trouver la solution…

Les erreurs remontées par Oracle

DatabaseError: ORA-06550, ce qui signifie qu’il y a une erreur de compilation côté Oracle, or d’après de nombreuses vérifications, tous les packages, triggers, etc. sont bien compilés dans la base de données.

PLS-00103: Encountered the symbol "" when expecting one of the following, ce qui signifie qu’il y a une erreur de syntaxe PL/SQL quelque part, mais où ? laquelle ? Tout semble bon et l’exécution des requêtes incriminées via SQL+ ou l’onglet “Test” du connecteur ZcxOracle fonctionnent très bien.

La cause

Après de nombreux tests et debugs, un post de blog m’a mis sur la bonne piste : Oracle semble s’en sortir assez mal si le code d’une requête SQL contient des retours chariots Windows CRLF !

Et il s’avère que c’est le cas, mais pas pour toutes les requêtes, uniquement celles qui font appel à une procédure stockée, exemple de contenu d’une ZSQL Method :

BEGIN
    schema.package.procedure(
        param1,
        param2,
        param3);
END;

Un patch rapide au niveau du connecteur ZcxOracleDA

Dans la méthode “query” de ZcxOracleDA/db.py, filtrer la requête SQL en remplaçant les caractères “CRLF” par leur équivalent Unix “LF”.

qs = qs.replace("\r\n", "\n")

Et voilà !

La vrai correction

Si vous travaillez sous Windows, configurer votre éditeur de sorte qu’il n’utilise pas de caractères CRLF mais uniquement les caractères Unix LF.

Ou encore mieux : passer à Linux/Unix !