Доступ к элементу массива 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
Другие вопросы по тегам