заменить один символ кавычки на две кавычки в informix

Я работаю над informix-4gl. Мои программы собираются добавлять и обновлять информацию о пользователе из одной таблицы во многие таблицы. В случае, если была информация от пользователя, содержащая символ «'» или одинарную кавычку, такую ​​как имя покупателя или адрес пользователя. Моя проблема заключается в том, что когда я обновляю таблицы, информация, содержащая символы одинарной кавычки, не обновляется. И теперь я обнаружил, что для ввода значений, которые были на другом онлайн-сервере, должны быть двойные кавычки. Теперь я собираюсь изменить одинарные кавычки на двойные кавычки. Я пытался изменить такой код, но он читает только одинарные кавычки.

          LET rmks_lgth = LENGTH(p_crsell.crse_purc_nme)    
  FOR a = 1 TO rmks_lgth                          
    IF p_crsell.crse_purc_nme[a] = "'" THEN       
     LET p_crsell.crse_purc_nme[a] = "''"        
   END IF                                        
  END FOR              

Я пытался изменить коды, чтобы создавать двойные кавычки. Кавычки должны удваиваться для каждого ввода, содержащего символ кавычки «'».

    LET rmks_lgth = LENGTH(p_crsell.crse_purc_nme)    
  FOR a = 1 TO rmks_lgth 
  FOR b = 1 TO rmks_lgth                         
    IF p_crsell.crse_purc_nme[a] = "'" THEN       
     LET p_crsell.crse_purc_nme[a] = "'"  
     LET p_crsell.crse_purc_nme[b] = "'"      
   END IF                                        
  END FOR        
  END FOR      

коды выше будут производить только вывод

''

где нет других значений. кто-то называет ceinmark, предположил, что «мне нужно создать функцию 4GL, чтобы найти цитату, затем разделить строку на две части в том месте, где вы ее нашли, и объединить «новую» цитату с этими двумя частями строки».


person Rahim Jaafar    schedule 25.10.2013    source источник


Ответы (1)


Рахим, приведенное ниже решение предназначено только для кода 4GL и не применяется к оператору Informix SQL. Это легко можно переписать в хранимую процедуру Informix (но я знаю, что SP это не решит вашу проблему):

MAIN
  DEFINE p_sql varCHAR(200)
  DEFINE p_dest varCHAR(200)
  DEFINE i,x,z INTEGER

  LET p_sql = arg_val(1)

  LET x=1
  LET p_dest=''
  FOR i = 1 TO length(p_sql)
    IF p_sql[i,i] = '"' THEN
      LET p_dest=p_dest,p_sql[x,i],'"'
      LET x=i+1
    END IF
  END FOR

  LET i=length(p_sql)
  IF x < i THEN
    LET p_dest=p_dest,p_sql[x,i]
  END IF

  DISPLAY p_sql
  DISPLAY p_dest
END MAIN

Результат теста:

$ fglgo x "test 'one' "
test 'one'
test 'one'

$ fglgo x 'test "one" '
test "one"
test ""one""

$ fglgo x 'test "one"'
test "one"
test ""one""

$ fglgo x 'test "one" x'
test "one" x
test ""one"" x
person ceinmart    schedule 25.10.2013
comment
привет, Ceinmart, я хотел бы спросить .. на самом деле, какова функция LET p_sql = arg_val (1)? - person Rahim Jaafar; 28.10.2013
comment
Цитата из Справочного руководства 4GL, которое можно бесплатно скачать здесь: The ARG_VAL( ) function returns a specified argument from the command line that invoked the current4GLapplication program. It can also return the name of the current4GLprogram - person ceinmart; 28.10.2013
comment
Спасибо, ceinmart, ваш ответ такой же, как я гуглил в Интернете. Я думал, что у него есть другая функция. Хорошо, большое спасибо .. - person Rahim Jaafar; 29.10.2013