|
Выполнить скрипт
|
|||
---|---|---|---|
#18+
DarkMaster, я думаю тоже не помогут. Потому что если DDL ты выполнил в автономке, а DML в основной транзакции, то кеш метаданных загружен на момент старта основной транзакции (или на момент старта блока), где таблички ещё нет. Поэтому я и говорю через ES конечно можно выполнить DDL, но тогда уж только его. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2015, 13:35 |
|
Выполнить скрипт
|
|||
---|---|---|---|
#18+
Симонов Денис Код: sql 1. 2. 3. 4. 5. 6.
Это же можно написать без execute block, просто в одной транзакции с клиента. Результат полагаю должен быть одинаковым. И там и там человек меняющий DDL таблицы и меняющий её данные обречён на неудачу. А кому нужен только DDL или только DML, тем придётся: - в случае с DML: написать один execute block или слать по одному запросу. - в случае с DDL: написать один execute block c execute statements или слать по одному запросу. Так что ничто не запрещено. Просто парсер в excute block не понимает DDL без execute statement. Всё. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2015, 13:35 |
|
Выполнить скрипт
|
|||
---|---|---|---|
#18+
-, не просто не понимает. Его туда умышлено не вводили из-за глюков которые однозначно будут. С клиента тебе тоже придётся сделать 1 или более DDL операторов затем подтвердить транзакцию, а только потом делать DML уже в другой транзакции. Просто в редакторе скриптов IBE или в ISQL для DDL по умолчанию стартуется отдельная транзакция которая по завершении оператора тут же завершается. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2015, 13:44 |
|
Выполнить скрипт
|
|||
---|---|---|---|
#18+
Симонов ДенисС клиента тебе тоже придётся сделать 1 или более DDL операторов затем подтвердить транзакцию, а только потом делать DML уже в другой транзакции. Ничто не мешает создать табличку A, и в той же транзакции сделать запись в табличку B, которая от A никак не зависит. Но опять же - это не то что интересно. Интересно пачкой выполнять именно DDL. Интерес в простоте работы со скриптами. Допустим скрипт лежит в файле. Как его сейчас применить например из кода Delphi? Нужно распарсить на стэйтменты. Для этого нужен парсер SQL, и не абы какой, а именно для FB нужной версии. Это сейчас. А как это делается в одну строчку, если бы в execute block не запретили DDL? вот так, например: Код: pascal 1.
Всё. Хотя если там в скрипте где-то есть "commit;", то кода получится лишь немногим больше, и опять же без парсенья SQL. Так что кто-то своим запретом малину всем портит :) Понятно что из благородных целей - с целью заботы о гражданах :) ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2015, 14:44 |
|
Выполнить скрипт
|
|||
---|---|---|---|
#18+
-Допустим скрипт лежит в файле. Как его сейчас применить например из кода Delphi? Нужно распарсить на стэйтменты. Для этого нужен парсер SQL, и не абы какой, а именно для FB нужной версии. Выдыхай... Код: pascal 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2015, 15:00 |
|
Выполнить скрипт
|
|||
---|---|---|---|
#18+
-, блин я такой парсер даже на PHP писал. Ничего там сложного нет. Ибо парсить команды до основания не надо. Достаточно найти разделить ну и чуть посложней повозиться с SET TERM, а также с игнором разделителей в строках и комментах. Причём это мало зависит от версии сервера. Вот сделать это без SET TERM чуть сложнее. Там как раз зависимость от версии может проявится. Ибо в FB3 есть CREATE/ALTER PACKAGE/FUNCTION которых в 2.5 не было. Но тоже можно, в IBE ведь сделали. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2015, 15:02 |
|
Выполнить скрипт
|
|||
---|---|---|---|
#18+
- Нужно распарсить на стэйтменты. Для этого нужен парсер SQL, и не абы какой, а именно для FB нужной версии. никакой парсер не нужен. Достаточно из потока текста выколупывать конструкции между разделителем N, который по умолчанию ";", и меняется по set term. Никаких других конструкций кроме set term распознавать не надо, вообще. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2015, 15:02 |
|
Выполнить скрипт
|
|||
---|---|---|---|
#18+
kdv, строки и комменты ещё надо, чтобы игнорировать разделители в них ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2015, 15:04 |
|
Выполнить скрипт
|
|||
---|---|---|---|
#18+
kdvникакой парсер не нужен. Достаточно из потока текста выколупывать конструкции между разделителем N, который по умолчанию ";", и меняется по set term. Никаких других конструкций кроме set term распознавать не надо, вообще. Кроме SET TERM есть еще кучка SET'ов, а также CONNECT/CREATE DATABASE. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2015, 15:13 |
|
Выполнить скрипт
|
|||
---|---|---|---|
#18+
DarkMaster-Допустим скрипт лежит в файле. Как его сейчас применить например из кода Delphi? Нужно распарсить на стэйтменты. Для этого нужен парсер SQL, и не абы какой, а именно для FB нужной версии. Выдыхай... Код: pascal 1. 2.
SQLScript - это что? Вот такой скрипт, сгенерённый IBExpert-ом он поймёт? Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79.
А тот же самый, но без SET TERM-ов он распарсит? Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65.
... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2015, 15:50 |
|
Выполнить скрипт
|
|||
---|---|---|---|
#18+
-А если сюда добавить конструкций из FB 4.0? Где взял? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2015, 15:59 |
|
Выполнить скрипт
|
|||
---|---|---|---|
#18+
балабол Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2015, 15:59 |
|
Выполнить скрипт
|
|||
---|---|---|---|
#18+
-SQLScript - это что? Вот такой скрипт, сгенерённый IBExpert-ом он поймёт? А тот же самый, но без SET TERM-ов он распарсит? А если сюда добавить конструкций из FB 4.0? - TIB_Script от ИБО - внутри есть парсер - его хватает за глаза (и парсер не особо навороченный, кстати) - Поймет - будет FB 4.0 - поймет и его ;) [sarcasm on] P.S. Вот правда если скрипт разбавить конструкциями от Oracle вперемешку с MSSQL - то да, облом выйдет ;( ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2015, 16:12 |
|
Выполнить скрипт
|
|||
---|---|---|---|
#18+
Симонов Денис-А если сюда добавить конструкций из FB 4.0? Где взял? Зачем ты меня троллишь таким вопросом? 4.0 если выйдет, то там наверняка будут новые языковые конструкции. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2015, 16:12 |
|
Выполнить скрипт
|
|||
---|---|---|---|
#18+
-, блин что там сложного то? Есть несколько типов команд: 1. SET TERM переключает терминатор (работает с незапамятных времён) 2. операторы в которых нет операторных скобок BEGIN...END. Таких большинство 3. операторы с операторными скобками CREATE/ALTER PROCEDURE/FUNCTION/PACKAGE/TRIGGER + EXECUTE BLOCK 4. спец команды, не являющиеся операторами CONNECT, SET DIALECT ... их надо обрабатывать отдельно Так вот весьма высока вероятность что в новой версии появятся команды из группы 2. Для них вообще ничего переделывать не придётся. Очень мала что из группы 3. Если работаем через SET TERM то и для них переделывать не придётся. Группы 1 и 4 не являются частью операторов FB, а являются расширениями конкретного клиента исполняющего скрипт. Поэтому на них пофиг. Можешь им сам синтаксис придумать любой. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2015, 16:30 |
|
Выполнить скрипт
|
|||
---|---|---|---|
#18+
DarkMaster - TIB_Script от ИБО - внутри есть парсер - его хватает за глаза (и парсер не особо навороченный, кстати) Ну тогда дай ссылку, чтобы мы все смогли осчастливиться :) Хотя смотрю что продукт платный, и разработчик является членом Firebird Foundation и все дела. Так что можно обойти отсутствие запрещённого функционала у FB, просто покупкой этого функционала у члена Firebird Foundation. Что-то меня понесло не туда... Или наоборот туда. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2015, 16:38 |
|
Выполнить скрипт
|
|||
---|---|---|---|
#18+
Симонов Денисблин что там сложного то? Есть несколько типов команд: 1. SET TERM переключает терминатор (работает с незапамятных времён) C SET TERM вообще никаких проблем нет. С ним всё просто. Но он не часть языка. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2015, 16:42 |
|
Выполнить скрипт
|
|||
---|---|---|---|
#18+
-Так что можно обойти отсутствие запрещённого функционала у FB, просто покупкой этого функционала у члена Firebird Foundation. Дык тут все просто - качаешь исходники FB с запрещенным функционалом, выдираешь оттуда запрещенный парсер, адаптируешь под свои нужды, получаешь НЕзапрещенный парсер, раздаешь всем и каждому - профит. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2015, 16:48 |
|
Выполнить скрипт
|
|||
---|---|---|---|
#18+
Симонов Денис4. спец команды, не являющиеся операторами CONNECT, SET DIALECT ... их надо обрабатывать отдельно дискуссия начинает уходить в космос, потому что исходно "минус" сказал про "как выполнить скрипт обновления своей БД из Дельфи". Так что база своя, connect не нужен, set dialect не нужен, и никакой другой set кроме term не нужен. -C SET TERM вообще никаких проблем нет. С ним всё просто. Но он не часть языка. правильно. Это конструкция ISQL. А ISQL что, парсит конструкции DML/DDL Firebird? Хрен там! Вы просто API не знаете. Достаточно "выкусить" оператор из разделителей, вызвать prepare, и получить, что это - DML (вплоть до select/insert/update/delete...) или DDL. Прекратите валять дурака. для парсинга скрипта никаких специфических конструкций языка знать не нужно. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2015, 17:05 |
|
Выполнить скрипт
|
|||
---|---|---|---|
#18+
to all какой-то апофеоз. Firebird не умеет выполнять скрипты. Он умеет выполнять единичные операторы. Firebird так устроен. isql - может выполнять скрипты, разделяя скрипт на отдельные операторы. isql не умеет выполнять DDL/DML, потому что из выполняет Firebird. Аминь. ISQL не является Firebird-ом, и наоборот. Пусть еще кто-нибудь скажет, что ISQL от Firebird 1.5 не умеет выполнять скрипты для Firebird 3.0 ... ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2015, 17:12 |
|
Выполнить скрипт
|
|||
---|---|---|---|
#18+
kdvТак что база своя, connect не нужен, set dialect не нужен, и никакой другой set кроме term не нужен. set term тоже нафиг не нужен. У меня разделитель, например, гвоздиком прибит в значение "^". kdvдля парсинга скрипта никаких специфических конструкций языка знать не нужно. Как минимум две конструкции знать нужно: delimited литералы и комментарии. Остальное действительно пофиг. "Это я тебе, голуба, говорю как краевед." (с) ЛФ Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2015, 17:13 |
|
Выполнить скрипт
|
|||
---|---|---|---|
#18+
- Код: sql 1. 2. 3. 4. 5.
Почему нельзя одним блоком пульнуть создание БД, без всяких скриптов? Оно вам не нужно. Вам нужно выполнять стейтменты по одному, или воспользоваться чужим кодом который парсит скрипт и дальше выполняет стэйтменты по одному. Вот как вам нужно. Я лучше знаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2015, 17:29 |
|
Выполнить скрипт
|
|||
---|---|---|---|
#18+
-, если оно будет выполняться с глюками, то действительно не нужно. Я уж лучше через isql выполню скрипт. Да, да в виде тех отдельных статментов с разбитых по разделителю. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2015, 17:35 |
|
Выполнить скрипт
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakovset term тоже нафиг не нужен. У меня разделитель, например, гвоздиком прибит в значение "^". Если гвоздиком прибить что-нибудь вроде "===!!!-----@@THIS_IS_TERMINATOR@@-----!!!===", то и литералы с комментариями пофигу будут :) ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2015, 17:38 |
|
Выполнить скрипт
|
|||
---|---|---|---|
#18+
kdvкакой-то апофеоз. Firebird не умеет выполнять скрипты. Он умеет выполнять единичные операторы. Firebird так устроен. Вот. А еще Firebird умеет выполнять execute block. Но не умеет выполнять в нём DDL. Верней умеет, и корректно, но только через execute statement. Собственно это ядро беседы которую я начал и которая мне на самом деле интересна и полезна. И даже код на Delphi привёл, как было бы просто если бы execute block не ленился и выполнял DDL. Но собеседники цепляются за частности и уводят действительно в космос. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2015, 17:39 |
|
|
start [/forum/topic.php?fid=40&msg=38996955&tid=1562742]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
39ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
59ms |
get tp. blocked users: |
1ms |
others: | 270ms |
total: | 415ms |
0 / 0 |