Доступ к элементу массива SQL из Libreoffice Basic
У меня есть база данных postgresql, которая содержит данные программы. В Libreoffice Calc у меня есть базовые макросы, которые взаимодействуют с базой данных postgresql и используют Calc в качестве пользовательского клиента. Одна из таблиц postgresql имеет массив, и я не могу индексировать этот массив напрямую из Basic.
Вот таблица настроек, как показано в pgAdmin:
sq_num integer,
year_start integer,
id serial NOT NULL,
"roleArray" text[]
Скажем, я хочу ВЫБРАТЬ roleArray[50]. Каждая моя попытка сделать это из Basic приводит ко всему передаваемому массиву. Я, конечно, могу сам разбить массив и получить нужный элемент, но я использовал массивы SQL, чтобы помочь автоматизировать этот процесс.
Мой основной код использует файл базы Libreoffice для подключения к базе данных postgresql. Переходя к базовому файлу, я не могу создать запрос, который выберет отдельный элемент и не вернет весь массив, ЕСЛИ Я не выбрал кнопку "Выполнить команду SQL напрямую" и запустил этот запрос:
SELECT "roleArray"['50'] FROM myTableThatHasArrays
Затем я получаю элемент 50 из каждой записи, как задумано.
Я считаю, что есть отчет об ошибке, который описывает это, где анализатор команд Base не может обрабатывать индексирование массива. Мой вопрос: что является лучшим методом для преодоления этого?
Лучший сценарий - это возможность индексировать элемент в массиве SQL напрямую из Basic.
1 ответ
Похоже, вы использовали XRow.getString, который (достаточно разумно) извлекает массив в виде одной большой строки. Вместо этого используйте XRow.getArray, а затем XArray.getArray. Вот рабочий пример:
sSQL = "SELECT id, ""roleArray""[2] FROM mytablethathasarrays;"
oResult = oStatement.executeQuery(sSQL)
s = ""
Do While oResult.next()
sql_array = oResult.getArray(2)
basic_array = sql_array.getArray(Null)
s = s & oResult.getInt(1) & " " & basic_array(1) & CHR$(10)
Loop
MsgBox s