Ответы пользователя по тегу Oracle
  • Как настроить кодировку sql developer?

    erge
    @erge
    Примус починяю
    У меня в Oracle SQL Developer так:
    Tools -> Preferences

    Вкладка Envirement: Encoding: UTF-8

    Вкладка Database -> NLS:
    Language: RUSSIAN,
    Territory: RUSSIA,
    Sort: RUSSIAN,
    Date Language: RUSSIAN

    PS: правда девелопер старенький, но не думаю что местоположение настроек сильно отличается.
    Ответ написан
    Комментировать
  • Как подключиться к БД на oracle VM virtualbox c основной ОС?

    erge
    @erge
    Примус починяю
    А почему у вас во втором Rule 2 стоит IP 192.168.122.1 а не 10.0.2.15 если по 10.0.2.15 соединяется на SSH гостя ???

    UPD:
    В SQL Developer необходимо указать непосредственно порт подключения 1520, т.к. он отличается от стандартного, либо в правиле указать портфорвардинг один к одному 1521 на 1521, если конечно на хосте этот порт свободен.
    Ответ написан
  • Как вывести всю строку в FOR..IN не перечисляя вручную столбцы?

    erge
    @erge
    Примус починяю
    DECLARE
        l_sql        VARCHAR2(32767):='
          SELECT 1 field_11, ''river'' field_22 FROM DUAL
          UNION ALL
          SELECT 1 field_11, ''sharf'' field_22 FROM DUAL
        ';
        l_cur        PLS_INTEGER := DBMS_SQL.OPEN_CURSOR;
        l_ind        PLS_INTEGER;
        l_col_count  PLS_INTEGER;
        l_col_names  DBMS_SQL.DESC_TAB;
        l_out        VARCHAR2(32767);
        col_val_chr  VARCHAR2(32767);
        LNBR         VARCHAR2(2)  := CHR(13)||CHR(10);
        col_delim    VARCHAR2(20) := '</td><td>';
        row_delim    VARCHAR2(20) := '</td></tr>'|| LNBR ||'<tr><td>';
    BEGIN
        -- Разбор запроса
        DBMS_SQL.PARSE (
          l_cur,
          l_sql,
          DBMS_SQL.NATIVE
        );
        -- Получение информации о столбцах
        DBMS_SQL.DESCRIBE_COLUMNS (l_cur, l_col_count, l_col_names);
        -- Вывод каждого из имен столбцов
        FOR col_ind IN 1 .. l_col_count
        LOOP
            -- Определим тип столбца
            DBMS_SQL.DEFINE_COLUMN(l_cur, col_ind, col_val_chr, 32767);
            -- Выводим наимнование столбца
            l_out := l_out || l_col_names(col_ind).col_name;
            -- Если не последний эл. вставляем разделитель
            IF col_ind != l_col_count
            THEN
                l_out := l_out || col_delim;
            END IF;
        END LOOP;
    
        -- Выполняем и фетчим курсор
        l_ind := DBMS_SQL.EXECUTE (l_cur);
        LOOP
            l_ind := DBMS_SQL.FETCH_ROWS( l_cur );
            EXIT WHEN l_ind = 0;
    
            l_out := l_out || row_delim;
    
            FOR col_ind IN 1 .. l_col_count
            LOOP
                -- Читаем и выводим значение
                DBMS_SQL.COLUMN_VALUE (l_cur, col_ind, col_val_chr);
                l_out := l_out || col_val_chr;
                -- Если не последний эл. вставляем разделитель
                IF col_ind != l_col_count
                THEN
                    l_out := l_out || col_delim;
                END IF;
            END LOOP;
        END LOOP;
        DBMS_SQL.CLOSE_CURSOR (l_cur);
        DBMS_OUTPUT.PUT_LINE('<table>'||LNBR||'<tr><td>'|| l_out ||'</td></tr>'||LNBR||'</table>');
    END;
    /
    
    /*
        -- Если задать разделители полей ; и LNBR то на выходе получим CSV данные
        col_delim    VARCHAR2(20) := ';';
        row_delim    VARCHAR2(20) := LNBR;
    */


    см. пример на dbfiddle

    PS: Вы видимо что-то недочитали :)
    Спасибо, сам разобрался, даже и не знал что так можно, теперь наверно буду использовать :)

    UPDATE:
    Можно обернуть в функцию и помимо прочего передавать в нее тип разделителя (для HTML можно передавать стили или classname для таблицы) и на выходе иметь разный формат данных.
    Ответ написан
    Комментировать
  • Как корректно разбить строку на подстроки по разделителю на множестве строк (по датасету)?

    erge
    @erge Автор вопроса
    Примус починяю
    Необходимо использовать LATERAL (inline-представление), как посоветовал Максим Y
    Но, до версии 12С это было типа недокументированной "фичей" и чтобы ее включить необходимо выполнить:
    alter session set events '22829 trace name context forever';


    Попробовал в 11g (на dbfiddle.uk) и сработало!

    https://dbfiddle.uk/?rdbms=oracle_11.2&fiddle=3aa5...

    PS: попробовал у себя на 9i и.... тоже сработало! ))

    alter session set events '22829 trace name context forever';
    
    WITH 
      test AS (
    SELECT 'проул.' as code, 'проул.|пр-к|' as str FROM dual UNION
    SELECT 'ул.' as code, 'ул.|улица|ул-ца|' as str FROM dual UNION
    SELECT 'пер.' as code, 'пер.|переулок|' as str FROM dual UNION
    SELECT 'кв-л' as code, 'кв-л|квартал|' as str FROM dual UNION
    SELECT 'линия' as code, 'линия|' as str FROM dual UNION
    SELECT 'парк' as code, 'парк|' as str FROM dual UNION
    SELECT 'рзд' as code, 'рзд|разъезд|' as str FROM dual UNION
    SELECT 'сад' as code, 'Сад|' as str FROM dual UNION
    SELECT 'тракт' as code, 'тракт|' as str FROM dual UNION
    SELECT 'тер' as code, 'тер|территория|' as str FROM dual UNION
    SELECT 'ст' as code, 'ст|станция|' as str FROM dual UNION
    SELECT 'сл' as code, 'сл|слобода|' as str FROM dual UNION
    SELECT 'пр-кт' as code, 'пр.|проспект|пр-кт|' as str FROM dual UNION
    SELECT 'шоссе' as code, 'ш.|шоссе|' as str FROM dual UNION
    SELECT 'пл' as code, 'пл|площадь|пл-дь|' as str FROM dual UNION
    SELECT 'наб.' as code, 'наб.|набережная|наб-ая|' as str FROM dual UNION
    SELECT 'тупик' as code, 'тупик|' as str FROM dual UNION
    SELECT 'мост' as code, 'мост|' as str FROM dual UNION
    SELECT 'пр.' as code, 'проезд|пр.|' as str FROM dual UNION
    SELECT 'блв.' as code, 'блв.|бульвар|' as str FROM dual UNION
    SELECT 'мкн.' as code, 'мкн.|микрорайон|' as str FROM dual UNION
    SELECT 'пос.' as code, 'пос.|посёлок|' as str FROM dual UNION
    SELECT 'овраг' as code, 'овраг|' as str FROM dual UNION
    SELECT 'городок' as code, 'городок|' as str FROM dual
    )
    SELECT t1.code, SUBSTR(t1.str, 
                  DECODE(t2.lvl, 1, 1, INSTR(t1.str, '|', 1, t2.lvl - 1) + 1),
                  INSTR(t1.str, '|', 1, t2.lvl) 
                  - DECODE(t2.lvl, 1, 1, INSTR(t1.str, '|', 1, t2.lvl - 1) + 1))
    FROM test t1,
      LATERAL (SELECT level AS lvl FROM dual
             CONNECT BY NVL(INSTR(t1.str, '|', 1, level), 0) > 0) t2
    ;


    так же есть еще вариант, через преобразование в XML:
    WITH
    str_csv AS (
      SELECT 'проул.' as code, 'проул.|пр-к|' as str FROM dual UNION
      SELECT 'ул.' as code, 'ул.|улица|ул-ца|' as str FROM dual UNION
      SELECT 'пер.' as code, 'пер.|переулок|' as str FROM dual UNION
      SELECT 'кв-л' as code, 'кв-л|квартал|' as str FROM dual UNION
      SELECT 'линия' as code, 'линия|' as str FROM dual UNION
      SELECT 'парк' as code, 'парк|' as str FROM dual UNION
      SELECT 'рзд' as code, 'рзд|разъезд|' as str FROM dual UNION
      SELECT 'сад' as code, 'Сад|' as str FROM dual UNION
      SELECT 'тракт' as code, 'тракт|' as str FROM dual UNION
      SELECT 'тер' as code, 'тер|территория|' as str FROM dual UNION
      SELECT 'ст' as code, 'ст|станция|' as str FROM dual UNION
      SELECT 'сл' as code, 'сл|слобода|' as str FROM dual UNION
      SELECT 'пр-кт' as code, 'пр.|проспект|пр-кт|' as str FROM dual UNION
      SELECT 'шоссе' as code, 'ш.|шоссе|' as str FROM dual UNION
      SELECT 'пл' as code, 'пл|площадь|пл-дь|' as str FROM dual UNION
      SELECT 'наб.' as code, 'наб.|набережная|наб-ая|' as str FROM dual UNION
      SELECT 'тупик' as code, 'тупик|' as str FROM dual UNION
      SELECT 'мост' as code, 'мост|' as str FROM dual UNION
      SELECT 'пр.' as code, 'проезд|пр.|' as str FROM dual UNION
      SELECT 'блв.' as code, 'блв.|бульвар|' as str FROM dual UNION
      SELECT 'мкн.' as code, 'мкн.|микрорайон|' as str FROM dual UNION
      SELECT 'пос.' as code, 'пос.|посёлок|' as str FROM dual UNION
      SELECT 'овраг' as code, 'овраг|' as str FROM dual UNION
      SELECT 'городок' as code, 'городок|' as str FROM dual
    ),
    str_xml AS (
      SELECT code, XMLType('<a><b>'||replace(str, '|','</b><b>')||'</b></a>') xml FROM str_csv
    )
    SELECT
        code, extractValue(value(t),'b') str_type
      FROM
        str_xml s,
        TABLE(XMLSequence(s.xml.extract('a/b'))) t
      WHERE extractValue(value(t),'b') is not null
    ;
    Ответ написан
    Комментировать
  • Как бэкапить БД Oracle?

    erge
    @erge
    Примус починяю
    В пределах ОС одного семейства (типа) просто "холодный" бекап - копирование файлов БД.
    с созданием соответствующего init файла и возможно пересозданием control файлов (если пути до базы различаются), так же настроить listener для прослушки соединений на БД, при этом сами СУБД должны быть полностью идентичны (одна и та же версия, разрядность и т.п.)

    PS: возможно не самый быстрый способ, но самый простой.

    PPS: если переносить между разными версиями СУБД и ОС, то имхо , только exp/imp
    можно еще по линкам данные перекачивать или велосипедные файловые репликации (но это между рабочими БД со структурой данных)...
    Ответ написан
    Комментировать
  • Как загрузить записи текущего месяца через SQL Loader?

    erge
    @erge
    Примус починяю
    попробуйте:

    datevalue "TO_DATE( :datevalue , 'YYYY-MM-DD')"

    см. TO_DATE() - преобразует строку в дату.
    Ответ написан
    Комментировать
  • Как объединить подзапросы?

    erge
    @erge Автор вопроса
    Примус починяю
    PS: извиняюсь, поспешил, таки пропустил... по параметрам что выбрал, оба запроса были пустые.

    Все работает:

    SELECT
        DECODE(NVL(an.id,0), 0,ao.id, an.id) AS id,
        DECODE(NVL(an.id,0), 0,ao.dt_beg, an.dt_beg) AS dt_beg,
        DECODE(NVL(an.id,0), 0,ao.dt_end, an.dt_end) AS dt_end
      FROM
      (.....) ao
      FULL OUTER JOIN (.....) an ON ao.id = an.id
      WHERE (an.id is null OR ao.id is null)
        AND (ao.id = _NUMBER_ OR an.id = _NUMBER_)
    ;
    Ответ написан
    Комментировать
  • Возможно ли в одной выборке вывести несколько COUNT`ов с условием?

    erge
    @erge
    Примус починяю
    а взять и просто написать, вместо того чтобы спрашивать?
    COUNT не считает NULL
    SELECT
        key,
        count(DECODE(value, 'tino',1, NULL)) AS tino,
        count(DECODE(value, 'tipo',1, NULL)) AS tipo,
        count(DECODE(value, 'tiko',1, NULL)) AS tiko
      FROM table1
      GROUP BY key


    см. на sqlfiddle
    Ответ написан
    Комментировать