REGEXP_SUBSTR/REGEXP_INSTR: ORA-01428: argument ‘-1’ is out of range
Monday, 11.02.2013 – DejanProgramiram ja danas nesto i hocu pri tome koristiti regular expression (REGEXP_SUBSTR, REGEXP_INSTR i REGEXP_REPLACE), ali sam na jednom “problemu” izgubio 3-4 sata i ne mogu da nadjem uzrok te greske… Ni Google mi nije pomogao, MyOracleSupport takodje nista…
Htio sam koristiti opciju “backward search”, tj. da se pattern u stringu trazi unatrag, a ne od pocetka. Dakle, ovaj SQL:
select regexp_instr('Austria01#Vienna01#1130', '#', -1, 1) from dual;
izbacuje gresku:
ORA-01428: argument '-1' is out of range
Sluzbena dokumentacija prvo kaze:
“position: A nonzero integer indicating the character of source_char where the function begins the search. When position is negative, then the function counts and searches backward from the end of string.”
A na drugom mjestu samo:
“position is a positive integer indicating the character of source_char where Oracle should begin the search.”
Dakle, sta je od ovih tvrdnji u sluzbenoj dokumentaciji tacno!?
Kao sto rekoh, pretragom interneta nisam nasao nikakve korisne informacije, tako da sam kreirao Service Request kod Oracle Support, pa cemo vidjeti sta ce oni reci…
Stay tuned.
Edit 21.02.2013.:
nakon prepiske sa Oracle Supportom, ustanovljeno je da je dokumentacija pogresna. 🙂
Ovo su mi javili:
“Hello,
the new doc bug 16374293 has been created and it was already screened for DBE, then it will be processed in accord with its priority and the next Olap guides will be corrected.
Thanks for your hint.”
Znaci, trenutno nije moguce koristiti backward search sa REGEXP komandama…
4 Responses to “REGEXP_SUBSTR/REGEXP_INSTR: ORA-01428: argument ‘-1’ is out of range”
Prvi link se odnosi na funkciju regexp_instr u okviru OLAP DML i to je novost u OLAP DML-u (pogledati link http://docs.oracle.com/cd/E18283_01/olap.112/e17122/whatsnew.htm#CEGIFDDD)
Moguće je da ova funkcija nije isto implementirana u PL/SQL-u kao u OLAP, tj. da onako kako je opisana na prvom linku zaista i radi kada se definiše cube ili nešto slično, dok u PL/SQL okruženju ne poznaje mogućnost negativnog parametra position…
By djoka_l on Feb 12, 2013
Hvala djoka na komentaru, ali!!! 🙂
Probao sam REGEXP_INSTR i u bazi, koja ima OLAP:
select * from v$version;
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 – 64bit Production
PL/SQL Release 11.2.0.3.0 – Production
CORE 11.2.0.3.0 Production
TNS for IBM/AIX RISC System/6000: Version 11.2.0.3.0 – Production
NLSRTL Version 11.2.0.3.0 – Production
select * from v$option
where parameter = ‘OLAP’;
PARAMETER VALUE
———– ——
OLAP TRUE
select regexp_instr(‘Austria01#Vienna01#1130’, ‘#’, -1, 1) from dual;
ORA-01428: argument ‘-1’ is out of range
By Dejan on Feb 12, 2013
Verovatno si se i sam snašao, ali ako neko i dalje razmišlja o tome kako naći poslednji znak ‘#’ u stringu
select regexp_instr(‘Austria01#Vienna01#1130′, ‘#[^#]*$’, 1, 1) from dual
nalazi (poslednji) znak # za kojim do kraja stringa ne sledi ni jedan drugi znak #
By djoka_l on Feb 13, 2013
Dakle, nakon prepiske sa Oracle Supportom, ustanovljeno je da je dokumentacija pogresna. 🙂
Ovo su mi javili:
“Hello,
the new doc bug 16374293 has been created and it was already screened for DBE, then it will be processed in accord with its priority and the next Olap guides will be corrected.
Thanks for your hint.”
Znaci, trenutno nije moguce koristiti backward search sa REGEXP komandama 🙁
@djoka_l: ma ovaj regexp_instr sam naveo samo kao dummy primjer 🙂 u praksi radim malo komplikovanije regexp perverzije 😉
hvala na tvom prijedlogu, bice od koristi! 🙂
By Dejan on Feb 21, 2013