Oracle преобразовать строку в массив
Обновлено: 04.07.2024
Коллекции присутствую в том или ином виде в большинстве языков программирования и везде имеют схожую суть в плане использования. А именно – позволяют хранить набор объектов одного типа и проводить над всем набором какие-либо действия, либо в цикле проводить однотипные действия со всеми элементами набора.
Таким же образом коллекции используются и в Oracle.
Содержание статьи
Общие сведения о коллекциях в pl/sql
-
Создание коллекции происходит в два этапа
Сначала мы объявляем тип(type) коллекции (конструкции assoc_array_type_def, varray_type_def и nested_table_type_def будут приведены далее)
Типы коллекций
Тип коллекции | Количество элементов | Тип индекса | Плотная или разреженная | Без инициализации | Где объявляется | Использование в SQL |
---|---|---|---|---|---|---|
Ассоциативный массив (index by table) | Не задано | String Pls_integer | Плотная и разреженная | Empty | PL/SQL block Package | Нет |
Varray (variable-size array) | Задано | Integer | Только плотная | Null | PL/SQL block Package Schema level | Только определенные на уровне схемы |
Nested table | Не задано | Integer | При создании плотная, может стать разреженной | Null | PL/SQL block Package Schema level | Только определенные на уровне схемы |
Плотность коллекции означает, что между элементами коллекции нет пропусков, пустых мест. Некоторые коллекции, как видно из таблицы, могут быть разреженными – т.е. могут иметь разрывы между элементами. Это значит, что в коллекции, например, могут быть элементы с индексом 1 и 4, а с индексом 2 и 3 элементов нет. При этом слоты памяти под 2-й и 3-й элементы будут существовать и будут принадлежать коллекции (в случае nested table), но не содержать при этом объектов и попытка прочитать содержимое этих элементов вызовет ошибку no_data_found.
Подробности можно узнать из видео-лекции в конце статьи.
Ассоциативный массив
- Набор пар ключ-значение
- Данные хранятся в отсортированном по ключу порядке
- Не поддерживает DML-операции (не может участвовать в селектах, не может храниться в таблицах)
- При объявлении как константа должен быть сразу инициализирован функцией
- Порядок элементов в ассоциативном массиве с строковым индексом зависит от параметров NLS_SORT и NLS_COMP
- Нельзя объявить тип на уровне схемы, но можно в пакете
- Не имеет конструктора
- Индекс не может принимать значение null (но допускает пустую строку — подробности и ссылка на пример в первом комментарии)
- Datatype – это любой тип данных, кроме ref cursor
- Для помещения в память небольших таблиц-справочников
- Для передачи в качестве параметра коллекции
Restrictions:
При изменении параметров NLS_SORT и NLS_COMP во время сессии после заполнения ассоциативного массива, можем получать неожиданные результаты вызовов методов first, last, next, previous. Также могут возникнуть проблемы при передаче ассоциативного массива в качестве параметра на другую БД с иными настройками NLS_SORT и NLS_COMP
Varray
Представляет собой массив последовательно хранящихся элементов
Тип описывается следующим образом (varay_type_def):
- Размер задается при создании
- Индексируется с 1
- Инициализируется конструктором
- Если параметры в конструктор не передаются, возвращается пустая коллекция
- Datatype – это любой тип данных, кроме ref cursor
- Знаем максимально возможное количество элементов
- Доступ к элементам последовательный
Restrictions:
Максимальный размер – 2 147 483 647 элементов
Nested table
Тип описывается следующим образом (nested_table_type_def):
- Размер коллекции изменяется динамически
- Может быть в разряженном состоянии, как показано на картинке
< - Инициализируется конструктором
- Если параметры в конструктор не передаются, возвращается пустая коллекция
- Datatype – это любой тип данных, кроме ref cursor
- Если содержит только одно скалярное значение, то имя колонки – Column_Value
Set operations с nested tables
Операции возможны только с коллекциями nested table. Обе коллекции, участвующие в операции, должны быть одного типа.
Результатом операции также является коллекция nested table.
Операция | Описание |
---|---|
MULTISET UNION | Возвращает объединение двух коллекций |
MULTISET UNION DISTINCT | Возвращает объединение двух коллекций с дистинктом (убирает дубли) |
MULTISET INTERSECT | Возвращает пересечение двух коллекций |
MULTISET INTERSECT DISTINCT | Возвращает пересечение двух коллекций с дистинктом (убирает дубли) |
SET | Возвращает коллекцию с дистинктом (т.е. коллекцию без дублей) |
MULTISET EXCEPT | Возвращает разницу двух коллекций |
MULTISET EXCEPT DISTINCT | Возвращает разницу двух коллекций с дистинктом (убирает дубли) |
Небольшой пример (обратите внимание на результат операции MULTISET EXCEPT DISTINCT)
У меня есть вход ' 1,2,3' , и мне нужно преобразовать его в массив.
вот еще один более простой вариант
ответ дан Richard Sylvester, с репутацией 481, 27.01.2015Oracle предоставляет встроенную функцию DBMS_UTILITY. COMMA_TO_TABLE .
К сожалению, этот не работает с номерами:
Но с небольшим трюком для префикса элементов с 'x', это работает:
С уважением, Роб.
ответ дан Rob van Wijk, с репутацией 15247, 30.09.2010У нас никогда не останется альтернативы делать одно и то же по-разному, верно? Я недавно нашел это очень удобно:
Я знаю, что переполнение стека хмурится при вставке URL-адресов без объяснений, но у этой конкретной страницы есть несколько действительно хороших вариантов:
Мне особенно нравится этот, который преобразует список с разделителями во временную таблицу, к которой вы можете выполнять запросы:
Да, это очень расстраивает, что dbms_utility. comma_to_table поддерживает только списки, разделенные запятыми, и только тогда, когда элементы в списке являются допустимыми идентификаторами PL / SQL (поэтому числа вызывают ошибку).
Посмотрим на выход :
ответ дан Lalit Kumar B, с репутацией 33145, 17.02.2016Это не экспертный ответ, поэтому я надеюсь, что кто-то улучшит этот ответ.
Быстрый поиск на моем BBDD привел меня к функции под названием split:
Я не знаю, будет ли это полезно, но мы нашли это здесь . , ,
Запускать его слишком дорого, так как он вычисляет полное разбиение каждый раз, когда вызывающий абонент запрашивает один из элементов в нем. , ,
Вы можете использовать функцию замены, чтобы легко заменить запятую. Делать это -
Синтаксис для функции REPLACE в SQL Server (Transact-SQL):
ЗАМЕНИТЬ (строка, строка_место, замена_строка)
Параметры или аргументы
string: Исходная строка, из которой последовательность символов будет заменена другим набором символов.
string_to_replace: Строка, которая будет искать в string1.
replace_string: Строка замены. Все вхождения string_to_replace будут заменены замещающей строкой в string1.
Примечание :
Функция REPLACE выполняет замену, которая не с учетом регистра. Таким образом, все вхождения string_to_replace будут заменено на replace_string независимо от случая string_to_replace или replace_string
Например:
ВЫБЕРИТЕ ЗАМЕНУ ( 'Kapil, raj, chouhan', ',', '' ) от DUAL;
Результат: Капил радж чухан
ИЗБРАННОЕ ЗАМЕНА ( «Я живу в Индии», «,» - «) из ДВОЙНОГО;
Результат: я живу в Индии
ВЫБРАТЬ ЗАМЕНУ ( 'facebook. com ',' face ',' friends ') от DUAL;
Результат: книга друзей. com
В Oracle PL/SQL Associative Arrays, также известные как индексные таблицы, в которых для значений индекса используя произвольные числа и строки. Associative Arrays - это набор пар ключ-значение, где каждый ключ уникален и используется для нахождения соответствующего значения в массиве.
Синтаксис
Синтаксис для определения, а затем объявление переменной типа Associative Arrays в Oracle PL/SQL.
TYPE type_assoc_arr IS TABLE OF element_type [NOT NULL]INDEX BY [PLS_INTEGER | BINARY_INTEGER | VARCHAR2(size_limit)];
INDEX BY key_type;
var_type type_assoc_arr;
Параметры или аргументы
type_assoc_arr – имя типа Associative Arrays
element_type - любой тип данных PL/SQL, за исключением REF CURSOR
key_type тип индекса, может быть числовым: PLS_INTEGER или BINARY_INTEGER, это может быть также VARCHAR2 или один из его подтипов VARCHAR, STRING или LONG.
var_type - имя переменной типа Associative Arrays
Примечание
- Типы RAW, LONG RAW, ROWID, CHAR и CHARACTER не разрешены в качестве ключей для Associative Arrays.
- Associative Arrays могут хранить данные с использованием значения первичного ключа в качестве индекса, где значения ключа не являются последовательными.
- Когда вы ссылаетесь на элемент Associative Arrays, который использует ключ на основе VARCHAR2, вы можете использовать другие типы, такие как DATE или TIMESTAMP, если они могут быть преобразованы в VARCHAR2 с помощью функции TO_CHAR.
- Не используйте TO_CHAR (SYSDATE) в качестве ключа.
Примеры
Рассмотрим некоторые примеры чтобы понять как работать с ассоциативным массивом в Oracle PL/SQL.
Associative Arrays, индексированный VARCHAR2
TYPE population IS TABLE OF NUMBER -- Тип ассоциативного массива city_population population; -- переменная ассоциативного массива -- Добавление элементов (пары ключ-значение) в ассоциативный массив: i := city_population. FIRST ; -- Получим первый элемент массива i := city_population. NEXT (i); -- Получим следующий элемент массиваВ этом примере мы определили тип ассоциативного массива population , индексированного строкой, объявили переменную этого типа city_population , заполнили переменную тремя элементами, изменили значение одного элемента и напечатали значения (в порядке сортировки, а не в порядке создания). (FIRST и NEXT - методы коллекций).
Associative Arrays, индексированный целым числом
В этом примере определяется тип ассоциативного массива, индексированный PLS_INTEGER, и функция возвращает ассоциативный массив.
TYPE sum_multiples IS TABLE OF PLS_INTEGER INDEX BY PLS_INTEGER ; n PLS_INTEGER := 5; -- number of multiples to sum for display В результате получим сумму первых пяти чисел кратных 3:Associative Arrays подходит для:
Относительно небольшая таблица поиска, которая может быть построена в памяти каждый раз, когда вы вызываете подпрограмму или инициализируете пакет, который ее объявляет.
Передача коллекций на сервер базы данных и обратно.
Заметка:
Вы не можете объявить тип Associative Arrays на уровне схемы. Поэтому, чтобы передать переменную Associative Arrays в качестве параметра в отдельную сохраненную подпрограмму, вы должны объявить тип этой переменной в спецификации пакета. Это делает тип доступным для вызываемой подпрограммы (которая объявляет формальный параметр этого типа) и вызывающей подпрограммы или анонимного блока (который объявляет и передает переменную этого типа)
Например.
Коллекции присутствую в том или ином виде в большинстве языков программирования и везде имеют схожую суть в плане использования. А именно – позволяют хранить набор объектов одного типа и проводить над всем набором какие-либо действия, либо в цикле проводить однотипные действия со всеми элементами набора.
Таким же образом коллекции используются и в Oracle.
Содержание статьи
Общие сведения о коллекциях в pl/sql
-
Создание коллекции происходит в два этапа
Сначала мы объявляем тип(type) коллекции (конструкции assoc_array_type_def, varray_type_def и nested_table_type_def будут приведены далее)
Типы коллекций
Тип коллекции | Количество элементов | Тип индекса | Плотная или разреженная | Без инициализации | Где объявляется | Использование в SQL |
---|---|---|---|---|---|---|
Ассоциативный массив (index by table) | Не задано | String Pls_integer | Плотная и разреженная | Empty | PL/SQL block Package | Нет |
Varray (variable-size array) | Задано | Integer | Только плотная | Null | PL/SQL block Package Schema level | Только определенные на уровне схемы |
Nested table | Не задано | Integer | При создании плотная, может стать разреженной | Null | PL/SQL block Package Schema level | Только определенные на уровне схемы |
Плотность коллекции означает, что между элементами коллекции нет пропусков, пустых мест. Некоторые коллекции, как видно из таблицы, могут быть разреженными – т.е. могут иметь разрывы между элементами. Это значит, что в коллекции, например, могут быть элементы с индексом 1 и 4, а с индексом 2 и 3 элементов нет. При этом слоты памяти под 2-й и 3-й элементы будут существовать и будут принадлежать коллекции (в случае nested table), но не содержать при этом объектов и попытка прочитать содержимое этих элементов вызовет ошибку no_data_found.
Подробности можно узнать из видео-лекции в конце статьи.
Ассоциативный массив
- Набор пар ключ-значение
- Данные хранятся в отсортированном по ключу порядке
- Не поддерживает DML-операции (не может участвовать в селектах, не может храниться в таблицах)
- При объявлении как константа должен быть сразу инициализирован функцией
- Порядок элементов в ассоциативном массиве с строковым индексом зависит от параметров NLS_SORT и NLS_COMP
- Нельзя объявить тип на уровне схемы, но можно в пакете
- Не имеет конструктора
- Индекс не может принимать значение null (но допускает пустую строку — подробности и ссылка на пример в первом комментарии)
- Datatype – это любой тип данных, кроме ref cursor
- Для помещения в память небольших таблиц-справочников
- Для передачи в качестве параметра коллекции
Restrictions:
При изменении параметров NLS_SORT и NLS_COMP во время сессии после заполнения ассоциативного массива, можем получать неожиданные результаты вызовов методов first, last, next, previous. Также могут возникнуть проблемы при передаче ассоциативного массива в качестве параметра на другую БД с иными настройками NLS_SORT и NLS_COMP
Varray
Представляет собой массив последовательно хранящихся элементов
Тип описывается следующим образом (varay_type_def):
- Размер задается при создании
- Индексируется с 1
- Инициализируется конструктором
- Если параметры в конструктор не передаются, возвращается пустая коллекция
- Datatype – это любой тип данных, кроме ref cursor
- Знаем максимально возможное количество элементов
- Доступ к элементам последовательный
Restrictions:
Максимальный размер – 2 147 483 647 элементов
Nested table
Тип описывается следующим образом (nested_table_type_def):
- Размер коллекции изменяется динамически
- Может быть в разряженном состоянии, как показано на картинке
< - Инициализируется конструктором
- Если параметры в конструктор не передаются, возвращается пустая коллекция
- Datatype – это любой тип данных, кроме ref cursor
- Если содержит только одно скалярное значение, то имя колонки – Column_Value
Set operations с nested tables
Операции возможны только с коллекциями nested table. Обе коллекции, участвующие в операции, должны быть одного типа.
Результатом операции также является коллекция nested table.
Операция | Описание |
---|---|
MULTISET UNION | Возвращает объединение двух коллекций |
MULTISET UNION DISTINCT | Возвращает объединение двух коллекций с дистинктом (убирает дубли) |
MULTISET INTERSECT | Возвращает пересечение двух коллекций |
MULTISET INTERSECT DISTINCT | Возвращает пересечение двух коллекций с дистинктом (убирает дубли) |
SET | Возвращает коллекцию с дистинктом (т.е. коллекцию без дублей) |
MULTISET EXCEPT | Возвращает разницу двух коллекций |
MULTISET EXCEPT DISTINCT | Возвращает разницу двух коллекций с дистинктом (убирает дубли) |
Небольшой пример (обратите внимание на результат операции MULTISET EXCEPT DISTINCT)
Читайте также: