mmm creo que lo que quieres hacer se parece mucho a algo que hago para leer una cadena separada por tabs, haber si me puedo explicar (y se ve bien)
Código:
v_variable1 := trim(substr(retrieved_buffer, 1, instr(retrieved_buffer, chr(09)) - 1));
v_variable2 := trim(substr(retrieved_buffer, instr(retrieved_buffer, chr(09), 1, 1) +1, instr(retrieved_buffer, chr(09), 1,2) - instr(retrieved_buffer, chr(09), 1, 1)-1));
v_variable3 := trim(substr(retrieved_buffer, instr(retrieved_buffer, chr(09), 1, 2) +1, instr(retrieved_buffer, chr(09), 1,3) - instr(retrieved_buffer, chr(09), 1, 2)-1));
por supuesto "retrieved_buffer" es el string
al final en v_variable1 queda el contenido entre el primer caracter y la primera aparicion de un tab (chr(09))
en v_variable2 queda el contenido entre la primera aparicion de un tab y la segunda aparicion de un tab
y asi sucesivamente, tal vez solo modificandolo para que sea la primera aparicion de un "?" y un "=" para lo que necesitas quedaria