REGEXP_SUBSTR/REGEXP_INSTR: ORA-01428: argument ‘-1’ is out of range

Monday, 11.02.2013 – Dejan

Programiram 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…

  1. 4 Responses to “REGEXP_SUBSTR/REGEXP_INSTR: ORA-01428: argument ‘-1’ is out of range”

  2. 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

  3. 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

  4. 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

  5. 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

Post a Comment