2015-01-26 4 views
0

Я использовал функцию ниже, чтобы извлечь строку из символьной строки во входном файле, проблема в том, что когда я помещаю строковый символ со строкой, я не могу ее извлечь ехр в качестве входных данных:извлечь строку с строкой quote issue pl sql

AA015streetl'adeuilAB00201AC0041234AD012XXXXXXXXXXXXAE009TTTTTTTTT

FUNCTION get_string (p_name IN    VARCHAR2, 
        p_strg IN    VARCHAR2, 
        p_len OUT NOCOPY  PLS_INTEGER, 
        p_value OUT NOCOPY  VARCHAR2) 
     RETURN PLS_INTEGER 
    IS 
     v_counter PLS_INTEGER := 1; 
     v_strg  VARCHAR2 (4096) := SUBSTR (p_strg, 5); 
    BEGIN 
     p_value := NULL; 
     p_len := 0.; 

     WHILE v_counter < LENGTH (v_strg) 
     LOOP 
      IF SUBSTR (v_strg, v_counter, 3.) = p_name 
      THEN 
       p_len := 
        TO_NUMBER (SUBSTR (v_strg, v_counter + 3., 3.)); 
       p_value := 
        SUBSTR (v_strg, v_counter + 6., p_len); 
       RETURN (declaration_cst.ok); 
      END IF; 

      v_counter := 
        v_counter 
       + 6. 
       + TO_NUMBER (SUBSTR (v_strg, v_counter + 3., 3.)); 
     END LOOP; 

     RETURN (declaration_cst.nok); 
      END; 
    END get_string; 
+1

Я не уверен, что вы просите - вы говорите, что не можете передать строку в функцию, когда в ней есть одна цитата, или вы говорите, что вывод функции неверен? Подробнее о проблеме, которую вы испытываете, пожалуйста. – Boneist

+0

Привет, я имею в виду, что выход функции неверен, когда у нее есть одиночная кавычка в строке на входе – user2425416

+0

, не правильно, каким образом? Что вы ожидали увидеть и что на самом деле выводили? – Boneist

ответ

2

Если у вас есть одиночные кавычки, внедренный в строковый литерал вы пытаетесь перейти к функции или процедуры, вам необходимо удвоить (т.е. типа два одиночные кавычки вместо одного), чтобы PL/SQL правильно интерпретировал его. Двойная одинарная кавычка будет отправлена ​​в функцию как только одна кавычка, как вы планируете, но это то, как отдельные кавычки в литералах обрабатываются в PL/SQL. Таким образом, вместо вызова вашей функции, как

n := get_string ('AB', 
       'AA015streetl'adeuilAB00201AC0041234AD012XXXXXXXXXXXXAE009TTTTTTTTT', 
       p_len, 
       p_value); 

вы должны удвоить одиночные кавычки во втором параметре:

n := get_string ('AB', 
       'AA015streetl''adeuilAB00201AC0041234AD012XXXXXXXXXXXXAE009TTTTTTTTT', 
       p_len, 
       p_value); 

Если вы читаете данные из файла или другого внешнего источника, который вы не нужно это делать; это необходимо только тогда, когда строка буквально имеет в себе одну кавычку.

Делитесь и наслаждайтесь.

3

Для примера строки, которую вы показали, смещения подстроки и корректировки счетчика в вашем коде отключены. Это может извлечь любой из «метки»:

CREATE OR REPLACE FUNCTION get_string (p_name IN VARCHAR2, p_strg IN VARCHAR2, 
    p_len OUT NOCOPY PLS_INTEGER, p_value OUT NOCOPY VARCHAR2) 
RETURN PLS_INTEGER IS 
    v_counter PLS_INTEGER := 1; 
BEGIN 
    p_value := NULL; 
    p_len := 0; 

    WHILE v_counter < LENGTH (p_strg) 
    LOOP 
     IF SUBSTR (p_strg, v_counter, 2) = p_name 
     THEN 
      p_len := TO_NUMBER (SUBSTR (p_strg, v_counter + 2, 3)); 
      p_value := SUBSTR (p_strg, v_counter + 5, p_len); 
      RETURN declaration_cst.ok; 
     END IF; 

     v_counter := v_counter + 5 
      + TO_NUMBER (SUBSTR (p_strg, v_counter + 2, 3)); 
    END LOOP; 

    RETURN declaration_cst.nok; 
END get_string; 
/

Ваша версия теряла первые четыре символа полностью в v_strg задания, а затем регулировать, как если теги были три символа, а не два.

С испытательного блоком, как:

set serveroutput on size unlimited 
declare 
    str varchar2(256) := q'[AA015street l'adeuilAB00201AC0041234AD012XXXXXXXXXXXXAE009TTTTTTTTT]'; 
    len pls_integer; 
    value varchar2(256); 
    rc pls_integer; 
begin 
    rc := get_string('AB', str, len, value); 
    dbms_output.put_line('AB -> ' || rc ||':'|| len ||':'|| value); 
end; 
/

и изменение тегов «AB» это получает:

AA -> 0:15:street l'adeuil 
AB -> 0:2:01 
AC -> 0:4:1234 
AD -> 0:12:XXXXXXXXXXXX 
AE -> 0:9:TTTTTTTTT 
AF -> 1:0: 

SQL Fiddle demo с функцией обертки так извлеченная информация тега может быть показана более легко.

Не имеет значения, если строковое значение содержит одиночную кавычку, если длина тега правильная - это просто другой символ для substr и не будет интерпретироваться иначе.

Как отметил Боб Джарвис, существуют другие способы достижения этой проблемы, но это еще больше выходит за рамки того, что вы просили.

 Смежные вопросы

  • Нет связанных вопросов^_^