2013-07-28 2 views
0

Моя внешняя процедура Oracle должна кодировать некоторые зашифрованные значения и передавать их в приложение ASP.NET MVC через URL-адрес. Я уже знаю о utl_i18n.escape_reference и utl_url.escape, но они, похоже, не могут кодировать текст так же, как приложение ASP.NET.Как я могу кодировать этот компонент URI в PL/SQL?

Проблема в том, что + не получает кодировку и приходит как пробел при отладке приложения ASP.NET.

Следующие 3 заявления все возвратные «+», когда я запускаю их в ЖАБА, в то время как я ожидал «%2B»:

select utl_i18n.escape_reference('+') from dual 
select utl_url.escape('+') from dual 
select utl_i18n.escape_reference(utl_url.escape('+')) from dual 

Возможно, это связано с установить характер? Как проверить набор символов в IIS?

ответ

2

Это потому, что + является зарезервированным символом для UTL_URL.ESCAPE(); процитировать:

Зарезервированные символы состоят из: (?);

  • Semi-ободочной кишки() слэш (/), вопросительный знак, двоеточие (:), знак (@), амперсанд (&), знак равенства (=), знак плюс (+), знак доллара ($), и запятой (,)

Многие из зарезервированных символов используются в качестве разделителей в URL. Вам следует избегать символов, отличных от перечисленных здесь, используя escape_url. Кроме того, чтобы использовать зарезервированные символы в парах имя-значение строки запроса URL-адреса, эти символы должны быть экранированы отдельно.

Существует булева параметр escape_reserved_characters, который позволяет спасаясь от +:

Указывает, следует ли избежала URL зарезервирован символов. Если для параметра установлено значение TRUE, оба зарезервированных и незаконных URL-адреса будут экранированы. В противном случае экранируются только незаконные URL-адреса. Значение по умолчанию имеет значение FALSE.

Вы не можете использовать Boolean-х в SQL, так что вы должны сделать это в PL/SQL

declare 
    l_escaped_url varchar2(10); 
begin 
    l_escaped_url := utl_url.escape('+', True); 
    dbms_output.put_line(l_escaped_url); 
end; 
/
+0

Я ищу что-то подобное, я хочу, чтобы избежать «+» знак, но не другой защищены персонажи. Есть ли способ избежать определенных персонажей? –

+0

Я думаю, вам просто нужно вручную 'REPLACE()' в этой точке @Ash. – Ben

+0

Спасибо за такой быстрый ответ! Думаю, я нашел решение. Оказывается, нет смысла избегать специального символа, поэтому теперь я кодирую все зарезервированные символы. –