SQL

Oracle, SQL et LIMIT

Sous Oracle, le langage SQL ne comporte pas la fonction LIMIT, bien utile pour paginer les résultats d'une requête SELECT. Afin de pallier à cette absence, il est possible d'utiliser la pseudo-colonne ROWNUM.

Ainsi, pour ne prendre en compte que la 1ère ligne de résultats d'un SELECT:

SELECT <colonne_1>, &lt;colonne_n&gt;

FROM <table_1>, &lt;table_n&gt; WHERE <conditions> AND ROWNUM = 1;

Si vous souhaitez les résultats à partir de la 10ème ligne jusqu'à la 20ème:

SELECT <colonne_1>, &lt;colonne_n&gt;

FROM <table_1>, &lt;table_n&gt; WHERE <conditions> AND ROWNUM BETWEEN 10 AND 20;

Vous l'aurez compris, cette colonne s'utilise comme n'importe quelle autre colonne de type numérique, il est donc possible d'y appliquer tous les opérateurs habituels (=, <, >, =<, >=, BETWEEN, ...)

Oracle, ordres SQL et caractère '&'

Aujourd'hui, en exécutant des requêtes SQL sur une base Oracle 10g, j'ai été confronté à un léger soucis... J'essayais de lancer un UPDATE sur une table dont un des champs est de type VARCHAR2. Je voulais donc mettre à jour ce champ avec une chaîne de caractères contenant le caractère &. Mon ordre SQL intégré dans un bloc PL/SQL ressemblait à ça:

BEGIN

  • traitements ...

 

UPDATE TABLE SET CHAMP = 'blablabla... &nbsp; blablablabla...' WHERE ID = toto;

 

  • traitements ...

END; /

Or à l'exécution de la requête, que ce soit sous SQL Plus ou Toad (ou tout autre client Oracle), Oracle me demande d'entrer une valeur pour nbsp; :/

Ainsi, chaque occurence de &xxx dans un ordre SQL quelconque (SELECT, UPDATE, INSERT, DELETE, ...) est considérée comme un paramètre à passer à la requête. Soit, mais comment faire pour pouvoir utiliser ce caractère comme un caractère normal et non comme un caractère spécial ?

Pour cela, deux solutions:

  • La 1ère consiste à définir le paramètre DEFINE à OFF au début du script SQL. Par exemple:
    SET DEFINE OFF;

  BEGIN

  • traitements ...

 

UPDATE TABLE SET CHAMP = 'blablabla... &nbsp; blablablabla...' WHERE ID = toto;

 

  • traitements ...

END; /

  • La 2ème est d'utiliser la concaténation de chaîne et de couper la chaîne en question juste après chaque occurence de &. En effet, si il est placé en fin de chaîne, Oracle ne l'interprètera pas en tant que caractère spécial ! Ce qui donnerait dans notre cas:
    BEGIN
    
    • traitements ...

 

UPDATE TABLE SET CHAMP = 'blablabla... &' || 'nbsp; blablablabla...' WHERE ID = toto;

 

  • traitements ...

END; /

Cette 2nde solution a l'avantage de ne pas obliger à redéfinir un paramètre qui pourrait avoir des effets de bord ultérieurs...