как конвертировать CSV в таблицу в Oracle

Возможно, это немного поздно. Но вы можете использовать numpy.random.choice() , передавая параметр p:

val = numpy.random.choice(numpy.arange(1, 7), p=[0.1, 0.05, 0.05, 0.2, 0.4, 0.2])

10
задан APC 21 March 2019 в 09:13
поделиться

3 ответа

Следующие действия вызывать это как выберите * из таблицы (разделитель ('a, b, c, d'))

create or replace function splitter(p_str in varchar2) return  sys.odcivarchar2list
is
v_tab sys.odcivarchar2list:=new sys.odcivarchar2list();
begin
with cte as (select level  ind from dual
connect by 
level <=regexp_count(p_str,',') +1
)
select regexp_substr(p_str,'[^,]+',1,ind)
bulk collect into v_tab
from cte;
return v_tab;
end;
/
13
ответ дан 3 December 2019 в 16:28
поделиться

Увы, в 11g нам все еще нужно обрабатывать наши собственные токенизаторы PL / SQL, используя типы SQL. В 11gR2 Oracle предоставил нам функцию агрегирования для объединения результатов в строку CSV, поэтому, возможно, в 12i они предоставят обратную возможность.

Если вы не хотите создавать тип SQL, особенно вы можете использовать встроенный SYS.DBMS_DEBUG_VC2COLL, например:

create or replace function string_tokenizer
    (p_string in varchar2
        , p_separator in varchar2 := ',')
    return sys.dbms_debug_vc2coll
is
    return_value SYS.DBMS_DEBUG_VC2COLL;
    pattern varchar2(250);
begin

    pattern := '[^('''||p_separator||''')]+' ;

    select trim(regexp_substr (p_string, pattern, 1, level)) token
    bulk collect into return_value
    from dual
    where regexp_substr (p_string, pattern, 1, level) is not null
    connect by regexp_instr (p_string, pattern, 1, level) > 0;

    return return_value;

end string_tokenizer;
/

Вот он в действии:

SQL> select * from table (string_tokenizer('one, two, three'))
  2  /

COLUMN_VALUE
----------------------------------------------------------------
one
two
three

SQL>

Подтверждение: этот код является вариантом код, который я нашел в блоге Танеля Подера .

5
ответ дан 3 December 2019 в 16:28
поделиться

У меня нет установленной 11g, но есть операции PIVOT и UNPIVOT для преобразования столбцов в строки / строки в столбцы, что может быть хорошей отправной точкой.

http://www.oracle.com/technology/pub/articles/oracle-database-11g-top-features/11g-pivot.html

(На самом деле, проведено дополнительное расследование, это не выглядит подходит для этого случая - он работает с фактическими строками / столбцами, но не с наборами данных в столбце).

Также существуют DBMS_UTILITY.comma_to_table и table_to_comma для преобразования списков CSV в таблицы pl / sql. Есть некоторые ограничения (обработка перевода строки и т. Д.), Но это может быть хорошей отправной точкой.

Я бы предпочел использовать подход TYPE с простой функцией, которая выполняет comma_to_table, а затем PIPE ROW для каждой записи в результате comma_to_table (к сожалению, DBMS_UTILITY.comma_to_table - это процедура, поэтому ее нельзя вызывать из SQL).

0
ответ дан 3 December 2019 в 16:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: