Bonjour,
Voici une nouvelle problématique
Pour un besoin bien particulier, j'ai besoin de générer le genre de requête suivante:
Le Bind de la première colonne est effectué avec un OCI_BindString
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 SELECT /*+ index(MATABLE IDX1_MATABLE) */ ROWID, COL_CHAR1, COL_CHAR2,COL_NUMBER1 FROM MATABLE WHERE (COL_CHAR1 || COL_CHAR2 || TO_CHAR(COL_NUMBER1,'9')) >= (:COL_CHAR1 || :COL_CHAR2 || TO_CHAR(:COL_NUMBER1,'9'))
Le Bind de la deuxième colonne est effectué avec un OCI_BindString
Le Bind de la troisième colonne est effectué avec un OCI_BindInt
Le premier bind contient par exemple AAAA mais j'ai besoin d'affecté dans la deuxième colonne une valeur de type chr(0) (plus petit caractère dans la table ascii) et dans la troisième la valeur 0.
Pouvez-vous me confirmer le comportement d'OCI_BindString pour la deuxième colonne dans ce cas (est-ce que le caractère de valeur nul est bindé dans ce cas)?
J'ai le sentiment que OCI_BindString malgré la taille de la chaine passée à 1 'traite la chaine comme un null'
exemple :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 create table matable (col_char1 char(4), col_char2 char(1), col_number1(1)); create index idx1 on matable(COL_CHAR1 || COL_CHAR2 || TO_CHAR(COL_NUMBER1,'9')); insert into matable (col_char1,col_char2,col_number1) values ('AAAA',null,0); insert into matable (col_char1,col_char2,col_number1) values ('AAAA',' ',0); insert into matable (col_char1,col_char2,col_number1) values ('AAAA','A',0); insert into matable (col_char1,col_char2,col_number1) values ('AAAA','B',0);
Pour information, la requête suivante renvoie bien ce que je veux:
Pour information, la requête suivante renvoie bien ce que je veux:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 SELECT /*+ index(MATABLE IDX1_MATABLE) */ ROWID, COL_CHAR1, COL_CHAR2,COL_NUMBER1 FROM MATABLE WHERE (COL_CHAR1 || COL_CHAR2 || TO_CHAR(COL_NUMBER1,'9')) >= ('AAAA' || ' ' || TO_CHAR(0,'9'))
Pour information, la requête suivante ne renvoie pas ce que je veux:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 SELECT /*+ index(MATABLE IDX1_MATABLE) */ ROWID, COL_CHAR1, COL_CHAR2,COL_NUMBER1 FROM MATABLE WHERE (COL_CHAR1 || COL_CHAR2 || TO_CHAR(COL_NUMBER1,'9')) >= ('AAAA' || chr(0) || TO_CHAR(0,'9'))
Pour info:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 SELECT /*+ index(MATABLE IDX1_MATABLE) */ ROWID, COL_CHAR1, COL_CHAR2,COL_NUMBER1 FROM MATABLE WHERE (COL_CHAR1 || COL_CHAR2 || TO_CHAR(COL_NUMBER1,'9')) >= ('AAAA' || null || TO_CHAR(0,'9'))
SQL> select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - 64bit Production
PL/SQL Release 11.1.0.6.0 - Production
CORE 11.1.0.6.0 Production
TNS for HPUX: Version 11.1.0.6.0 - Production
NLSRTL Version 11.1.0.6.0 - Production
Version ocilib 3.4.0
D'avance merci.
Fly.
Partager