Создание временной таблицы в базе данных из StarBasic

Автор ost, 23 апреля 2017, 17:53

0 Пользователи и 1 гость просматривают эту тему.

ost

Доброго.
Не могу понять, почему первый макрос создает обычную таблицу в базе данных SQLite, но второй - не создает временную?
Помогите, пож., понять что происходит? Где ж ошибаюсь то?

Первый

Sub CreateTable1()
On Error Resume Next  
oBaseContext = CreateUnoService("com.sun.star.sdb.DatabaseContext")
oDB = oBaseContext.getByName("RegBL")
oCon = oDB.getConnection("", "")
oStatement = oCon.createStatement()
sCommandSQL = "CREATE TABLE IF NOT EXISTS Table1 (id, Name, Data)"
oStatement.executeQuery(sCommandSQL)
oDB.store()
sCommandSQL = "INSERT INTO Table1 (id, Name, Data) VALUES (1,2,3)"
oStatement.executeQuery(sCommandSQL)
oDB.DatabaseDocument.store()
oCon.close()
On Error GoTo 0
End Sub


Второй

Sub CreateTable2()
On Error Resume Next  
oBaseContext = CreateUnoService("com.sun.star.sdb.DatabaseContext")
oDB = oBaseContext.getByName("RegBL")
oCon = oDB.getConnection("", "")
oStatement = oCon.createStatement()
sCommandSQL = "CREATE TEMP TABLE IF NOT EXISTS Table2 (id, Name, Data)"
oStatement.executeQuery(sCommandSQL)
oDB.store()
sCommandSQL = "INSERT INTO Table2 (id, Name, Data) VALUES (1,2,3)"
oStatement.executeQuery(sCommandSQL)
oDB.DatabaseDocument.store()
oCon.close()
On Error GoTo 0
End Sub


rami

#1
Может быть вместо:
sCommandSQL = "CREATE TEMP TABLE IF NOT EXISTS Table2 (id, Name, Data)"
нужно:
sCommandSQL = "CREATE TEMPORARY TABLE IF NOT EXISTS Table2 (id, Name, Data)"


P.S. это вопрос не по Basic, а по SQLite. Читайте документацию по SQLite: SQLite Query Language: CREATE TABLE

kompilainenn

Цитата: rami от 23 апреля 2017, 16:23P.S. это вопрос не по Basic, а по SQLite
пришла пора создать отдельный раздел форума про SQlite?
Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут

rami

Цитата: kompilainenn от 23 апреля 2017, 19:01
Цитата: rami от 23 апреля 2017, 16:23P.S. это вопрос не по Basic, а по SQLite
пришла пора создать отдельный раздел форума про SQlite?
Не думаю, если код Basic работает, а код SQlite нет, то лучше искать на форумах SQlite, нам за ними не угнаться. В крайнем случае, можно обсуждать проблемы SQlite в разделе Base.

ost

"TEMPORARY" вместо "TEMP"  не помогло.
Выполнение "CREATE TEMP TABLE IF NOT EXISTS Table2 (id, Name, Data)" и в консоли от разработчиков SQLite, и в стороннем менеджере баз приводит к созданию временной таблицы. Но из Basic не получается.

rami

Цитата: ost от 23 апреля 2017, 17:39Но из Basic не получается.
А на что жалуется Basic? Уберите из кода On Error Resume Next

ost

#6
Говорит, что "Запрос не вернул допустимого набора значений."
Таак...
строка вида CREATE TEMP TABLE Table2 (id, Name, Data)
возвращает ошибку:
Ошибка времени выполнения BASIC.
Вызвано исключение
Type: com.sun.star.sdbc.SQLException
Message: table Table2 already exists (1).

Однако запрос в менеджере баз
SELECT * FROM sqlite_temp_master WHERE type='table'
ничего не возвращает.
Такое ощущение что Table2 создается где-то не в текущей базе. O_o

JohnSUN

#7
Такое ощущение, что executeQuery относится к запросам SELECT.
А запросы типа CREATE, INSERT или UPDATE (ну, которые не должны что-то возвращать) ожидают какого-то другого метода, нет?
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

economist

#8
Создание таблицы (удаление, вставка строк итп) - не возвращает набора значений. Никакой ошибки нет, её надо просто игнорить.

Эту же "ошибку" дает и GUI OpenOffice|LibreOffice, при выполнении Сервис-SQL с любым DDL-запросом.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

ost

Цитата: JohnSUN от 23 апреля 2017, 20:07А запросы типа CREATE,y INSERT или UPDATE (ну, которые не должны что-то возвращать) ожидают какого-то другого метода, нет?
Может быть. Попробую. Но ведь обычная таблица этим методом создается. А вот временная - нет. Или я не знаю где ее искать..=(

rami

Цитата: ost от 24 апреля 2017, 16:17Но ведь обычная таблица этим методом создается. А вот временная - нет. Или я не знаю где ее искать..=(
Message: table Table2 already exists (1). — говорит что таблица есть, но не говорит где ;D

А Документация что говорит? Temporary Files Used By SQLite

ost

Прочитал. Не понял, как же мне, все-таки, получить доступ к временной таблице из Basic. Как запросить данные временной таблицы из макроса? Как записать туда новые данные?

economist

ost - создавайте нормальную таблицу и грохайте её потом. Это быстрее, чем разбираться с Basic. Временная таблица существует во время коннекта, после Close или Commit она может исчезать.

С тем же SQLite я пришел к выводу, что если в таблице из 10000 строк изменились 100, но есть пара индексов - дешевле, быстрее и проще удалить таблицу, создать таблицу, создать индексы, импортировать все заново - чем делать вычурный Update. И Вам советую - не парьтесь.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...