Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Прошлая пятница Головоломка. Выпуск 6  [new]
ODBA
Member

Откуда:
Сообщений: 1723
У Некрасова Ивана есть текстовый файл. В нем содержится следующее:

ID : 1111
Поле1 : 1
Поле2 : 2
Поле3 : 3
ID : 2222
Поле1 : 1
Поле2 : 2
Поле3 : 3
ID : 3333
Поле1 : 1
Поле2 : 2
Поле3 : 3

Некрасов Иван воспользовался external table. Теперь ему необходимо сделать запрос к таблице, но так чтобы запрос вернул ему следующий результат:

ID Поле1 Поле2 Поле3
1111 1 2 3
2222 1 2 3
3333 1 2 3

Вот такая вот головоломка.
13 апр 06, 16:56    [2559880]     Ответить | Цитировать Сообщить модератору
 Re: Прошлая пятница Головоломка. Выпуск 6  [new]
Tolmachov Dmitiry
Member

Откуда: Москва, Пенза
Сообщений: 1520
У Буратино было 2 яблока, Маливина дала ему еще 1. Сколько у Буратино стало яблок?
13 апр 06, 16:58    [2559893]     Ответить | Цитировать Сообщить модератору
 Re: Прошлая пятница Головоломка. Выпуск 6  [new]
HX
Member

Откуда: Moscow
Сообщений: 2454
Tolmachov Dmitiry
У Буратино было 2 яблока, Маливина дала ему еще 1. Сколько у Буратино стало яблок?

А он очень прожорливый?..
13 апр 06, 17:00    [2559913]     Ответить | Цитировать Сообщить модератору
 Re: Прошлая пятница Головоломка. Выпуск 6  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18336
ODBA
У Некрасова Ивана есть текстовый файл. В нем содержится следующее:
Вот такая вот головоломка.

И что тут головоломного?
CONTINUEIF (1) = 'I', delimiter установить в ':' или прочитать про Filler?
13 апр 06, 17:00    [2559917]     Ответить | Цитировать Сообщить модератору
 Re: Прошлая пятница Головоломка. Выпуск 6  [new]
ODBA
Member

Откуда:
Сообщений: 1723
Друзья, внимательно читаем задание!
13 апр 06, 17:03    [2559933]     Ответить | Цитировать Сообщить модератору
 Re: Прошлая пятница Головоломка. Выпуск 6  [new]
ODBA
Member

Откуда:
Сообщений: 1723
Ну и чего? Не понравился вопрос? Или вы все уже решили, что сойдет ответ про : - хотя вопрос то совершенно про другое...:) Чего молчим, ГУРУ?
13 апр 06, 17:21    [2560062]     Ответить | Цитировать Сообщить модератору
 Re: Прошлая пятница Головоломка. Выпуск 6  [new]
Elic
Member

Откуда:
Сообщений: 29976
ODBA
Друзья, внимательно читаем задание!
необходимо сделать запрос
Поскольку не сказано, как создана таблица, то возможны два ответа:
  • запрос тривиален (если таблица создана, как надо)
  • задача нерешаема ввиду отсутствия ключа упорядочивания (если таблица создана тупо).
    В обоих случаях вообще непонятно, причём тут внешняя таблица.


    P.S. "Но ведь я же не отдам некту яблоко, хоть он дерись" (с) Буратино
  • 13 апр 06, 17:28    [2560103]     Ответить | Цитировать Сообщить модератору
     Re: Прошлая пятница Головоломка. Выпуск 6  [new]
    Tolmachov Dmitiry
    Member

    Откуда: Москва, Пенза
    Сообщений: 1520
    Топ № 14
    13 апр 06, 17:31    [2560124]     Ответить | Цитировать Сообщить модератору
     Re: Прошлая пятница Головоломка. Выпуск 6  [new]
    andrey_anonymous
    Member

    Откуда: Москва
    Сообщений: 18336
    ODBA
    Друзья, внимательно читаем задание!

    Простите, но я, похоже, не догоняю прелести задачи...
    Мне представляется достаточным при загрузке развернуть текст:
    ID : 1111\nПоле1 : 1\nПоле2 : 2\nПоле3 : 3
    ID : 2222\nПоле1 : 1\nПоле2 : 2\nПоле3 : 3
    ID : 3333\nПоле1 : 1\nПоле2 : 2\nПоле3 : 3

    и грузить поля: 2, 4, 6, 8...

    Я не осознал чего-то очень важного?
    13 апр 06, 18:30    [2560433]     Ответить | Цитировать Сообщить модератору
     Re: Прошлая пятница Головоломка. Выпуск 6  [new]
    hell
    Member

    Откуда:
    Сообщений: 3001
    andrey_anonymous
    ODBA
    Друзья, внимательно читаем задание!

    Простите, но я, похоже, не догоняю прелести задачи...
    Мне представляется достаточным при загрузке развернуть текст:
    ID : 1111\nПоле1 : 1\nПоле2 : 2\nПоле3 : 3
    ID : 2222\nПоле1 : 1\nПоле2 : 2\nПоле3 : 3
    ID : 3333\nПоле1 : 1\nПоле2 : 2\nПоле3 : 3

    и грузить поля: 2, 4, 6, 8...

    Я не осознал чего-то очень важного?


    я думаю эту хрень загрузили как в случае 2 у Elic :-)
    т.е. ровно в 2 колонки :-)
    13 апр 06, 18:40    [2560478]     Ответить | Цитировать Сообщить модератору
     Re: Прошлая пятница Головоломка. Выпуск 6  [new]
    andrey_anonymous
    Member

    Откуда: Москва
    Сообщений: 18336
    hell
    я думаю эту хрень загрузили как в случае 2 у Elic :-)
    т.е. ровно в 2 колонки :-)

    Вообще-то условие задачи выглядит обнозначным - надо сделать запрос к external table. Про то, что это безобразие уже куда-то загружено, ни слова не сказано. Иначе условие неполно и вопрос Elic приобретает вполне злой смысл ;)
    13 апр 06, 18:43    [2560488]     Ответить | Цитировать Сообщить модератору
     Re: Прошлая пятница Головоломка. Выпуск 6  [new]
    andrey_anonymous
    Member

    Откуда: Москва
    Сообщений: 18336
    ODBA
    хотя вопрос то совершенно про другое...:)
    ODBA, так про что же вопрос???
    Неужели не поделитесь?
    Терпение уже истощилось, "... и компот не льется в рот..." (с) Филатов, спасайте :)
    13 апр 06, 19:22    [2560622]     Ответить | Цитировать Сообщить модератору
     Re: Прошлая пятница Головоломка. Выпуск 6  [new]
    ODBA
    Member

    Откуда:
    Сообщений: 1723
    Вопрос про то, что некий Некрасов загрузил в 2 столбца (external table). Теперь хочет сделать insert в другую таблицу, но чтобы результат был не в два столбца, а так как я написал выше. ТО есть типа чтобы по уму блоки из текстового файла залить в базу.
    13 апр 06, 19:27    [2560635]     Ответить | Цитировать Сообщить модератору
     Re: Прошлая пятница Головоломка. Выпуск 6  [new]
    ODBA
    Member

    Откуда:
    Сообщений: 1723
    То есть хочет сделать вот такого типа вставку

    Inserting Values with a Subquery: Example
    The following statement copies employees whose commission
    exceeds 25% of their salary into the bonuses table (which is
    created in "Merging into a Table: Example"):

    INSERT INTO bonuses
    SELECT employee_id, salary*1.1
    FROM employees
    WHERE commission_pct > 0.25 * salary;

    Примечание: это просто пример из документации

    Но при этом вставить не в ДВА столбца (так как есть сейчас у него), а как положено - в 4.

    Причем: в текстовом файле ЛЮБОЕ ИЗ
    ID Поле1 Поле2 Поле3
    может быть без значения, то есть запросто может быть так:

    ID : 1111
    Поле1
    Поле2 : 2
    Поле3
    ID
    Поле1 : 1
    Поле2 : 2
    Поле3 : 3
    ID : 3333
    Поле1 : 1
    Поле2
    Поле3 : 3
    13 апр 06, 19:34    [2560663]     Ответить | Цитировать Сообщить модератору
     Re: Прошлая пятница Головоломка. Выпуск 6  [new]
    Elic
    Member

    Откуда:
    Сообщений: 29976
    ODBA
    Но при этом вставить не в ДВА столбца (так как есть сейчас у него), а как положено - в 4.
    Ещё раз: ответ №2. STFF "порядок строк гарантирует order by и только order by"
    На форуме подобные, но правильные задачи решались не раз.

    Диагноз: автору за "задачу" - незачёт Картинка с другого сайта.
    13 апр 06, 19:46    [2560693]     Ответить | Цитировать Сообщить модератору
     Re: Прошлая пятница Головоломка. Выпуск 6  [new]
    andrey_anonymous
    Member

    Откуда: Москва
    Сообщений: 18336
    ODBA
    Причем: в текстовом файле ЛЮБОЕ ИЗ
    ID Поле1 Поле2 Поле3

    Ну что же, так действительно интереснее (отсутствие разделителя)

    Сразу оговорюсь - по техническим причинам external table не будет, будет sql*loader.

    Я взял файл такого содержания:
    -- Файл d.dat
    ID : 0000
    Поле1 : 1
    Поле2 : 2
    Поле3 : 3
    ID : 1111
    Поле1
    Поле2 : 2
    Поле3
    ID
    Поле1 : 1
    Поле2 : 2
    Поле3 : 3
    ID : 3333
    Поле1 : 1
    Поле2
    Поле3 : 3
    ID 
    Поле1
    Поле2
    Поле3 : 3
    

    Написал контрольник:
    --Файл d.ctl
    LOAD DATA
    INFILE "d.dat" "str '\n'"
    DISCARDFILE "data.dis"	
    DISCARDMAX 999	
    REPLACE
    CONTINUEIF NEXT PRESERVE (1:2) <> 'ID'
    INTO TABLE ANE_TEST 
    TRAILING NULLCOLS
    (
      N1_key terminated by ':',
      N1_val terminated by X'0D',
      N2_key terminated by ':',
      N2_val terminated by X'0D',
      N3_key terminated by ':',
      N3_val terminated by X'0D',
      N4_key terminated by ':',
      N4_val terminated by X'0D'
    )
    

    и cmd для загрузки:
    @echo off
    set nls_lang=american_america.ru8pc866
    sqlldr user/pass@database control=d.ctl

    Создал табличку:
    create table ane_test (n1_key varchar2(200), n1_val varchar2(200), 
                           n2_key varchar2(200), n2_val varchar2(200), 
                           n3_key varchar2(200), n3_val varchar2(200), 
                           n4_key varchar2(200), n4_val varchar2(200)
                          );

    и запустился:

    D:\temp>l
    
    SQL*Loader: Release 8.1.7.0.0 - Production on Thu Apr 13 20:47:32 2006
    
    (c) Copyright 2000 Oracle Corporation.  All rights reserved.
    
    Commit point reached - logical record count 4
    Commit point reached - logical record count 5

    Вот лог загрузки:
    SQL*Loader: Release 8.1.7.0.0 - Production on Thu Apr 13 20:47:32 2006
    
    (c) Copyright 2000 Oracle Corporation.  All rights reserved.
    
    Control File:   d.ctl
    Data File:      d.dat
      File processing option string: "str '\n'"
      Bad File:     d.bad
      Discard File: data.dis 
     (Allow 999 discards)
    
    Number to load: ALL
    Number to skip: 0
    Errors allowed: 50
    Bind array:     64 rows, maximum of 65536 bytes
    Continuation:   1:2 != 0X4944(character 'ID'), in next physical record
                    Preserving continuation characters as data
    Path used:      Conventional
    
    Table ANE_TEST, loaded from every logical record.
    Insert option in effect for this table: REPLACE
    TRAILING NULLCOLS option in effect
    
       Column Name                  Position   Len  Term Encl Datatype
    ------------------------------ ---------- ----- ---- ---- ---------------------
    N1_KEY                              FIRST     *   :       CHARACTER            
    N1_VAL                               NEXT     *  WHT      CHARACTER            
    N2_KEY                               NEXT     *   :       CHARACTER            
    N2_VAL                               NEXT     *  WHT      CHARACTER            
    N3_KEY                               NEXT     *   :       CHARACTER            
    N3_VAL                               NEXT     *  WHT      CHARACTER            
    N4_KEY                               NEXT     *   :       CHARACTER            
    N4_VAL                               NEXT     *  WHT      CHARACTER            
    
    
    Table ANE_TEST:
      5 Rows successfully loaded.
      0 Rows not loaded due to data errors.
      0 Rows not loaded because all WHEN clauses were failed.
      0 Rows not loaded because all fields were null.
    
    
    Space allocated for bind array:                  63984 bytes(31 rows)
    Space allocated for memory besides bind array:        0 bytes
    
    Total logical records skipped:          0
    Total logical records read:             5
    Total logical records rejected:         0
    Total logical records discarded:        0
    
    Run began on Thu Apr 13 20:47:32 2006
    Run ended on Thu Apr 13 20:47:35 2006
    
    Elapsed time was:     00:00:02.38
    CPU time was:         00:00:00.08    
    

    Вот содержимое таблички:
    select replace(n1_key,chr(13),null) n1_key, n1_val
         , replace(n2_key,chr(13),null) n2_key, n2_val
         , replace(n3_key,chr(13),null) n3_key, n3_val
         , replace(n4_key,chr(13),null) n4_key, n4_val
    from ane_test;
    
    N1_KEY               N1_VAL     N2_KEY               N2_VAL     N3_KEY               N3_VAL     N4_KEY               N4_VAL
    -------------------- ---------- -------------------- ---------- -------------------- ---------- -------------------- ----------
    ID                    0000      Поле1                 1         Поле2                 2         Поле3                 3
    ID                    1111      Поле1Поле2            2         Поле3                                                
    IDПоле1               1         Поле2                 2         Поле3                 3                              
    ID                    3333      Поле1                 1         Поле2Поле3            3                              
    ID Поле1Поле2Поле3    3                                                                                              

    После чего уже легко получил:

    select case
           when n1_key like 'ID%' then n1_val
           when n2_key like 'ID%' then n2_val
           when n3_key like 'ID%' then n3_val
           when n4_key like 'ID%' then n4_val
           end ID
         , case
           when n1_key like 'Поле1%' then n1_val
           when n2_key like 'Поле1%' then n2_val
           when n3_key like 'Поле1%' then n3_val
           when n4_key like 'Поле1%' then n4_val
           end "Поле1"
         , case
           when n1_key like 'Поле2%' then n1_val
           when n2_key like 'Поле2%' then n2_val
           when n3_key like 'Поле2%' then n3_val
           when n4_key like 'Поле2%' then n4_val
           end "Поле2"
         , case
           when n1_key like 'Поле3%' then n1_val
           when n2_key like 'Поле3%' then n2_val
           when n3_key like 'Поле3%' then n3_val
           when n4_key like 'Поле3%' then n4_val
           end "Поле3"
    from(
      select substr(n1_key,instr(n1_key, chr(13),-1)+1) n1_key, n1_val
           , substr(n2_key,instr(n2_key, chr(13),-1)+1) n2_key, n2_val
           , substr(n3_key,instr(n3_key, chr(13),-1)+1) n3_key, n3_val
           , substr(n4_key,instr(n4_key, chr(13),-1)+1) n4_key, n4_val
      from ane_test
    ) t;
    
    ID         Поле1      Поле2      Поле3
    ---------- ---------- ---------- ----------
     0000       1          2          3
     1111                  2         
                1          2          3
     3333       1                     3
                                      3
    13 апр 06, 21:11    [2560922]     Ответить | Цитировать Сообщить модератору
     Re: Прошлая пятница Головоломка. Выпуск 6  [new]
    andrey_anonymous
    Member

    Откуда: Москва
    Сообщений: 18336
    И еще оговорюсь - можно проще, этот текст - следствие размножения текста копипастом и автозаменами.
    andrey_anonymous
    select case
           when n1_key like 'ID%' then n1_val
           when n2_key like 'ID%' then n2_val
           when n3_key like 'ID%' then n3_val
           when n4_key like 'ID%' then n4_val
    
    13 апр 06, 21:22    [2560946]     Ответить | Цитировать Сообщить модератору
     Re: Прошлая пятница Головоломка. Выпуск 6  [new]
    SY
    Member

    Откуда: Middlebury, CT USA
    Сообщений: 10039
    2 andrey_anonymous:

    There is a big difference between what is available in SQL*Loader and external tables (ORACLE_LOADER/ORACLE_DATAPUMP Access Driver). And CONTINUEIF is not available in external tables. And, BTW, CONCATENATE 4 would be simpler in this case. As with external table, the only solution I can see now is:

    CREATE TABLE tbl_load(
                          rnum number,
                          cval varchar2(100)
                         )
      ORGANIZATION EXTERNAL(
                            TYPE ORACLE_LOADER
                            DEFAULT DIRECTORY tbl_load_dir
                            ACCESS PARAMETERS(
                                              FIELDS(
                                                     rnum RECNUM,
                                                     cval CHAR(100) 
                                                    )
                                             )
                            LOCATION(
                                     'tbl_load.dat'
                                    )
                           )
    /
    COLUMN ID FORMAT A10
    COLUMN FIELD1 FORMAT A10
    COLUMN FIELD2 FORMAT A10
    COLUMN FIELD3 FORMAT A10
    SELECT  MAX(
                DECODE(
                       cn,
                       0,cv,
                       NULL
                      )
               ) ID,
             MAX(
                DECODE(
                       cn,
                       1,cv,
                       NULL
                      )
               ) Field1,
             MAX(
                DECODE(
                       cn,
                       2,cv,
                       NULL
                      )
               ) Field2,
             MAX(
                DECODE(
                       cn,
                       3,cv,
                       NULL
                      )
               ) Field3
      FROM  (
             SELECT  TRUNC((rnum - 1)/4) rn,
                     MOD((rnum - 1),4)   cn,
                     LTRIM(
                           SUBSTR(
                                  LTRIM(
                                        cval,
                                        'Fiel'
                                       ),
                                  3
                                 ),
                           ' : '
                          ) cv
                FROM  tbl_load
            )
      GROUP BY rn
      ORDER BY rn
    /

    Now highlighed 'Fiel' should be changed to 'Пол', since I substituted Поле with Field in andrey_anonymous's sample:

    ID : 0000
    Field1 : 1
    Field2 : 2
    Field3 : 3
    ID : 1111
    Field1
    Field2 : 2
    Field3
    ID
    Field1 : 1
    Field2 : 2
    Field3 : 3
    ID : 3333
    Field1 : 1
    Field2
    Field3 : 3
    ID 
    Field1
    Field2
    Field3 : 3

    Below is the test:

    SQL> CREATE TABLE tbl_load(
      2                        rnum number,
      3                        cval varchar2(100)
      4                       )
      5    ORGANIZATION EXTERNAL(
      6                          TYPE ORACLE_LOADER
      7                          DEFAULT DIRECTORY tbl_load_dir
      8                          ACCESS PARAMETERS(
      9                                            FIELDS(
     10                                                   rnum RECNUM,
     11                                                   cval CHAR(100) 
     12                                                  )
     13                                           )
     14                          LOCATION(
     15                                   'tbl_load.dat'
     16                                  )
     17                         )
     18  /
    
    Table created.
    
    SQL> COLUMN ID FORMAT A10
    SQL> COLUMN FIELD1 FORMAT A10
    SQL> COLUMN FIELD2 FORMAT A10
    SQL> COLUMN FIELD3 FORMAT A10
    SQL> SELECT  MAX(
      2              DECODE(
      3                     cn,
      4                     0,cv,
      5                     NULL
      6                    )
      7             ) ID,
      8           MAX(
      9              DECODE(
     10                     cn,
     11                     1,cv,
     12                     NULL
     13                    )
     14             ) Field1,
     15           MAX(
     16              DECODE(
     17                     cn,
     18                     2,cv,
     19                     NULL
     20                    )
     21             ) Field2,
     22           MAX(
     23              DECODE(
     24                     cn,
     25                     3,cv,
     26                     NULL
     27                    )
     28             ) Field3
     29    FROM  (
     30           SELECT  TRUNC((rnum - 1)/4) rn,
     31                   MOD((rnum - 1),4)   cn,
     32                   LTRIM(
     33                         SUBSTR(
     34                                LTRIM(
     35                                      cval,
     36                                      'Fiel'
     37                                     ),
     38                                3
     39                               ),
     40                         ' : '
     41                        ) cv
     42              FROM  tbl_load
     43          )
     44    GROUP BY rn
     45    ORDER BY rn
     46  /
    
    ID         FIELD1     FIELD2     FIELD3
    ---------- ---------- ---------- ----------
    0000       1          2          3
    1111                  2
               1          2          3
    3333       1                     3
                                     3
    
    
    6 rows selected.
    
    SQL> 

    SY.
    13 апр 06, 22:33    [2561162]     Ответить | Цитировать Сообщить модератору
     Re: Прошлая пятница Головоломка. Выпуск 6  [new]
    andrey_anonymous
    Member

    Откуда: Москва
    Сообщений: 18336
    SY
    2 andrey_anonymous:
    There is a big difference between what is available in SQL*Loader and external tables (ORACLE_LOADER/ORACLE_DATAPUMP Access Driver). And CONTINUEIF is not available in external tables. And, BTW, CONCATENATE 4 would be simpler in this case. As with external table, the only solution I can see now is:

    Да, я в курсе про ограничения external tables.
    Что до CONCATENATE 4, то я отказался от этой мысли предвидя очевидную провокацию со стороны ODBA :)
    В любом случае Ваше решение весьма интересно, хотя, честно говоря, в боевой обстановке я бы не задумываясь воспользовался awk.
    В данных условиях гораздо дешевле преобразовать исходный файл, содержащий естественную связь между элементами, нежели восстанавливать порушенные при загрузке связи средствами SQL...
    13 апр 06, 22:52    [2561202]     Ответить | Цитировать Сообщить модератору
     Re: Прошлая пятница Головоломка. Выпуск 6  [new]
    andrey_anonymous
    Member

    Откуда: Москва
    Сообщений: 18336
    SY, наверное все-таки не очень удачная идея играть на совпадении префиксов имен полей - "ПолеX" не более чем условность.
    Важно только имя ID как признак начала записи.
    Полагаю, лучше играть на INSTR(cval,':') и проводить 0 через case|decode.
    13 апр 06, 22:59    [2561216]     Ответить | Цитировать Сообщить модератору
     Re: Прошлая пятница Головоломка. Выпуск 6  [new]
    SY
    Member

    Откуда: Middlebury, CT USA
    Сообщений: 10039
    andrey_anonymous
    SY, наверное все-таки не очень удачная идея играть на совпадении префиксов имен полей - "ПолеX" не более чем условность.
    Важно только имя ID как признак начала записи.
    Полагаю, лучше играть на INSTR(cval,':') и проводить 0 через case|decode.


    Well, I am not sure what you mean by "Важно только имя ID как признак начала записи". RECNUM is simplest generic solution to identify logical records and their columns (using TRUNC and MOD). And you are right, INSTR makes it generic and simpler:

    SQL> SELECT  MAX(
      2              DECODE(
      3                     cn,
      4                     0,cv,
      5                     NULL
      6                    )
      7             ) ID,
      8           MAX(
      9              DECODE(
     10                     cn,
     11                     1,cv,
     12                     NULL
     13                    )
     14             ) Field1,
     15           MAX(
     16              DECODE(
     17                     cn,
     18                     2,cv,
     19                     NULL
     20                    )
     21             ) Field2,
     22           MAX(
     23              DECODE(
     24                     cn,
     25                     3,cv,
     26                     NULL
     27                    )
     28             ) Field3
     29    FROM  (
     30           SELECT  TRUNC((rnum - 1)/4) rn,
     31                   MOD((rnum - 1),4)   cn,
     32                   SUBSTR(cval,
     33                          INSTR(cval || ': ',': ') + 2
     34                         ) cv
     35              FROM  tbl_load
     36          )
     37    GROUP BY rn
     38    ORDER BY rn
     39  /
    
    ID         FIELD1     FIELD2     FIELD3
    ---------- ---------- ---------- ----------
    0000       1          2          3
    1111                  2
               1          2          3
    3333       1                     3
                                     3
    
    
    6 rows selected.
    
    SQL> 

    SY.
    13 апр 06, 23:29    [2561294]     Ответить | Цитировать Сообщить модератору
     Re: Прошлая пятница Головоломка. Выпуск 6  [new]
    andrey_anonymous
    Member

    Откуда: Москва
    Сообщений: 18336
    А все-таки она ВЕРТИТСЯ!!!
    CREATE TABLE tbl_load(
                          rnum number,
                          id_val varchar2(100),
                          f1 varchar2(100),
                          f2 varchar2(100),
                          f3 varchar2(100)
                         )
      ORGANIZATION EXTERNAL(
        TYPE ORACLE_LOADER
        DEFAULT DIRECTORY ext_tables
        ACCESS PARAMETERS(RECORDS DELIMITED BY 'ID'
                          CHARACTERSET 'RU8PC866'
                          FIELDS
                          TERMINATED BY X'0D0A'
                          MISSING FIELD VALUES ARE NULL
                          (
                                 rnum RECNUM,
                                 id_val CHAR,
                                 f1 CHAR,
                                 f2 CHAR,
                                 f3 CHAR
                                )
                         )
        LOCATION(
                 'data.dat'
                )
       )
    REJECT LIMIT UNLIMITED
    /
    
    Table created
    col id_val format a10
    col f1 format a10
    col f2 format a10
    col f3 format a10
    select substr(id_val,case instr(id_val,':') when 0 then null else instr(id_val,':')+1 end) id_val
         , substr(f1,case instr(f1,':') when 0 then null else instr(f1,':')+1 end) f1
         , substr(f2,case instr(f2,':') when 0 then null else instr(f2,':')+1 end) f2
         , substr(f3,case instr(f3,':') when 0 then null else instr(f3,':')+1 end) f3
    from tbl_load;
    
    ID_VAL     F1         F2         F3
    ---------- ---------- ---------- ----------
     0000       1          2          3
     1111                  2         
                1          2          3
     3333       1                     3
                                      3
    
    6 rows selected
    
    SQL> 
    14 апр 06, 00:07    [2561396]     Ответить | Цитировать Сообщить модератору
     Re: Прошлая пятница Головоломка. Выпуск 6  [new]
    andrey_anonymous
    Member

    Откуда: Москва
    Сообщений: 18336
    Я тренировался на домашней 10g.
    Если кто соберется пробовать под нормальным сервером (*nix), скорректируйте TERMINATED BY X'0D0A', charset.
    Ну и MISSING FIELD VALUES ARE NULL тоже лишняя, дает ненужную (первую пустую) строчку.
    14 апр 06, 00:35    [2561479]     Ответить | Цитировать Сообщить модератору
     Re: Прошлая пятница Головоломка. Выпуск 6  [new]
    Ryaz
    Member

    Откуда:
    Сообщений: 1306
    Иван перец суръёзный, perl знает.
    по-этому пишет подобие универсального конвертатора минут так за 15-20 ;))

    #!/usr/bin/perl -w
    
    my $step;
    
    $step = $ARGV[0] || 4;
    
    print "\n Use step : ".$step."\n";
    
    open(TESTFILE, "<test.txt") || die $!;
    open(OUTFILE, ">out.txt") || die $!;
    
    foreach my $text (<TESTFILE>)
    	{
    	my ($field, $value) = split(":", $text);
    	
    	$value =~ s/ |\n|\t//mig;
    	
    	$counter++;
    
    	syswrite(OUTFILE, $value);
    	
    	if ($counter ne $step)
    		{
    		syswrite(OUTFILE, ",");
    		}
    
    	if ($counter eq $step)
    		{
                    syswrite(OUTFILE, "\n");
    		$counter = 0;
    		}
    	}
    
    if ($counter ne 0)
    	{
    	print "\n Transormed with warnings. Invalid step or format !!! \n";
    	0;
    	}
    else
    	{
            print "\n"." Transform done. Ivan + perl = ofigyet` !!!"."\n";
    	1;
    	}
    
    close(TESTFILE);
    close(OUTFILE);
    

    Вход

    ID : 	1
    Поле1 :      12
    Поле2 : 12
    Поле3 : 13
    ID : 2
    Поле1 : 22
    Поле2 : 22
    Поле3 : 23
    ID : 3
    Поле1 : 32
    Поле2 : 32
    Поле3 : 33
    ID : 4
    Поле1 : 42
    Поле2 : 42
    Поле3 : 43
    
    

    Выход

    1,12,12,13
    2,22,22,23
    3,32,32,33
    4,42,42,43
    

    дальше уже не интересно.
    14 апр 06, 09:36    [2561954]     Ответить | Цитировать Сообщить модератору
     Re: Прошлая пятница Головоломка. Выпуск 6  [new]
    Andrew Max
    Member

    Откуда:
    Сообщений: 1045
    В продолжение темы.

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

    Итак, нижеследующее получено в SQL*Plus. Никакого мошенничества и ручной правки, только некоторые команды заменены на многоточия:

    SQL*Plus: Release 9.2.0.6.0 - Production on Птн Июл 14 15:31:17 2006
    
    Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.
    
    SQL> conn max
    Введите пароль:
    Соединено.
    
    SQL> <...>
    SQL> <...>
    
    SQL> select 2 * 2 from dual;
    
           2*2
    ----------
             5
    
    SQL> select 2 + 2 from dual;
    
           2+2
    ----------
             5
    
    SQL>
    

    Вопрос: а что там было вместо многоточий?
    :)
    14 июл 06, 15:34    [2882404]     Ответить | Цитировать Сообщить модератору
    Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
    Все форумы / Oracle Ответить