1 pièce(s) jointe(s)
[OCILIB] OCI_BindString sur une chaine contenant un caractère NULL (chr(0))
Bonjour,
Voici une nouvelle problématique :lol:
Pour un besoin bien particulier, j'ai besoin de générer le genre de requête suivante:
Code:
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 première colonne est effectué avec un OCI_BindString
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:
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:
Code:
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 renvoie bien ce que je veux:
Code:
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 information, la requête suivante ne renvoie pas ce que je veux:
Code:
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')) |
Pour info:
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.