Страницы

четверг, августа 28, 2008

[напоминалка] Перевод строки в Oracle

Надо запомнить!!!

Перевод строки в Oracle выполняется лишь 10м символом, независимо от платформы! А ведь промучался с динамическим PL\SQL-кодом 3 дня! Думал сначала на права, потом на свои руки, потом на индусов, потом опять на свои руки, а вот в результате оказалось, что вместо chr(13)||chr(10) надо было ставить просто chr(10). И все, джобы с динамически сформированным кодом заработали.

5 комментариев:

  1. Спасибо! Однако у меня не так давно и классический CHR(10)||CHR(13) вполне работал в простом анонимном блоке. Может дело, в порядке слагаемых? Сперва перевод строки, потом возврат каретки? Или всё равно?

    ОтветитьУдалить
  2. Порядок слагаемых менять пробовал - эффекта полный ноль.
    Это касается исключительно(!) динамического PL\SQL-кода. Смотрим пример:
    declare
    -- Local variables here
    s VARCHAR2(32000);
    cr VARCHAR2(2) := CHR(10)||CHR(13);
    begin
    -- Test statements here
    s:='declare'||cr||' vTemp date;'||cr||'begin'||cr||' select sysdate into vTemp from dual;'||cr||'end;';
    EXECUTE IMMEDIATE s;
    end;

    ORA-06550: line 2, column 1:
    PLS-00103: Encountered the symbol "" when expecting one of the following:

    begin function package pragma procedure subtype type use
    <an identifier> <a double-quoted delimited-identifier> form
    current cursor
    ORA-06512: at line 9

    ОтветитьУдалить
  3. Порядок значения не имеет, должен быть только chr(10)

    ОтветитьУдалить
  4. Небольшой вопрос,

    В спецификации пакета UTL_TCP (Oracle 10.2) есть такой фрагмент

    /*
    * Carriage-return line-feed character sequence. This CRLF package variable
    * is intended to be a constant that denotes the carriage-return-line-feed
    * character sequence. Do not try to modify its value. Modification
    * of its value may result in errors in other PL/SQL applications.
    */
    CRLF VARCHAR2(10);

    В Oracle 11.1 написано следующее
    /*
    * Carriage-return line-feed character sequence.
    */
    CRLF CONSTANT VARCHAR2(2 CHAR) := unistr('\000D\000A');

    Это как-нибудь относится к топику?

    Спасибо

    ОтветитьУдалить
    Ответы
    1. Значение в UTL_TCP зависит от платформы, а перевод строки в коде всегда(!) CHR(10).

      Удалить