Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Dynamic Stored Procedures / 18 сообщений из 18, страница 1 из 1
10.08.2014, 14:05
    #38716775
noram
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dynamic Stored Procedures
Всем привет!
Пытаюсь перейти с SQL Server на FireBird. Никак не могу разобраться, как работают DSP, потратил уйму времени, чтобы найти хоть что-то по моей теме, но так ничего и не нашел, хотя наверное этот вопрос уже возникал 1000 раз.
Вот например простейшая ХП:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
create or alter procedure FBSP2
returns (
    PREFIX char(4))
as
begin
  FOR
     select PREFIX from MTABLE
     INTO :PREFIX
   DO
   BEGIN
     SUSPEND;
   END
end


Как мне сделать так, чтобы работала примерно такая ДХП?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
create or alter procedure FBSP2
returns (
    PREFIX char(4))
as
declare variable SQLSTR varchar(200);
begin
sqlstr = 'select PREFIX from MTABLE INTO :PREFIX';
  FOR
     sqlStr
   DO
   BEGIN
     SUSPEND;
   END
end


Заранее спасибо...
...
Рейтинг: 0 / 0
10.08.2014, 14:33
    #38716779
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dynamic Stored Procedures
noram,

Попутал 2 понятия. Саму SP и формирование запроса динамически внутри твоей ХП. Для второго варианта будет так:

Код: plsql
1.
2.
3.
FOR EXECUTE STATEMENT :SQL_TEXT 
INTO :VARIABLE1,....:VARIABLEnnn
DO SUSPEND;
...
Рейтинг: 0 / 0
10.08.2014, 14:35
    #38716780
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dynamic Stored Procedures
DarkMaster,

Т.е. твой пример будет выглядеть так:
Код: plsql
1.
2.
3.
4.
SQLTEXT='select PREFIX from MTABLE';
FOR EXECUTE STATEMENT SQLTEXT 
      INTO :PREFIX 
DO SUSPEND
...
Рейтинг: 0 / 0
10.08.2014, 14:39
    #38716781
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dynamic Stored Procedures
noramНикак не могу разобраться, как работают DSP
Тебе (для начала) будет лучше считать, что они вообще никак не работают.

Какую задачу ты пытаешься решить этим говнокодом?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
10.08.2014, 14:44
    #38716784
noram
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dynamic Stored Procedures
DarkMaster,
Большое спасибо!
То, что доктор прописал.
...
Рейтинг: 0 / 0
10.08.2014, 14:46
    #38716785
noram
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dynamic Stored Procedures
Dimitry Sibiryakov,
//Тебе (для начала) будет лучше считать, что они вообще никак не работают.//
Это еще почему?
...
Рейтинг: 0 / 0
10.08.2014, 14:55
    #38716786
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dynamic Stored Procedures
noramЭто еще почему?
Неразумное использование ES приводит к
а) Тормозам
б) SQL injection
в) говнокоду

Поэтому если ты решил взять на себя обычный для чайников религиозный обет "использовать в
коде приложения только запросы EXECUTE PROCEDURE и никогда даже не прикасаться к
SELECT/INSERT/UPDATE/DELETE", то лучше откажись от этой религии сразу, пока геморрой не
вырос на всю голову.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
10.08.2014, 15:41
    #38716794
noram
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dynamic Stored Procedures
Dimitry SibiryakovПоэтому если ты решил взять на себя обычный для чайников религиозный обет "использовать в
коде приложения только запросы EXECUTE PROCEDURE и никогда даже не прикасаться к
SELECT/INSERT/UPDATE/DELETE", то лучше откажись от этой религии сразу, пока геморрой не
вырос на всю голову.
Я только знакомлюсь с FireBird и никаких религиозных обетов брать не собираюсь. Но мне многое непонятно, главное - почему так мало документации по FireBird, как на английском, так и на русском. Из того, что я читал про свободные бд (например FB или PostgreSQL), многие приводят как большой минус FB осутсвие внятной документации. Рад был прочесть на этом форуме, что добрые люди начали проект по документации FB. Если дадите мне ссылку, где можно будет почитать про динамические ХП, а также правила хорошей практики, буду благодарен. И вообще, раз уж разговор об этом, насколько оправдано применение ХП в FB и можно ли обходится без них. Мой front end - Delphi XE5.
...
Рейтинг: 0 / 0
10.08.2014, 15:44
    #38716796
noram
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dynamic Stored Procedures
Я имел в виду, конечно, динамичсеких ХП....
...
Рейтинг: 0 / 0
10.08.2014, 15:53
    #38716799
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dynamic Stored Procedures
noramНо мне многое непонятно, главное - почему так мало документации по FireBird,
как на английском, так и на русском.
Сколько это по-твоему "мало"? Сколько из этого "мало" ты уже прочитал? Language Reference
ты уже прочитал? А Language Reference Update for version 2.5? Материалы с
http://www.ibase.ru/develop.htm ты прочитал все? Или хотя бы из раздела "для чайников"...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
10.08.2014, 15:58
    #38716800
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dynamic Stored Procedures
noramЯ только знакомлюсь с FireBird
Тогда зачем ты сразу полез в Dynamic SQL (который есть экзотика и не рекомендуется к
использованию в любой СУБД) и в хранимые процедуры вообще? Тебе действительно для какой-то
задачи не хватило обычного SQL?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
10.08.2014, 16:00
    #38716801
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dynamic Stored Procedures
noram,

никаких динамических ХП в Firebird нет. Есть выполнение динамических запросов в рамках PSQL (оператор EXECUTE STATEMENT). Ещё есть анонимные PSQL блоки (EXECUTE BLOCK).

Практически всё есть reference-manuals и release-notes Разжёванное есть на Документация и статьи
...
Рейтинг: 0 / 0
10.08.2014, 16:10
    #38716804
noram
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dynamic Stored Procedures
Dimitry SibiryakovТогда зачем ты сразу полез в Dynamic SQL (который есть экзотика и не рекомендуется к
использованию в любой СУБД) и в хранимые процедуры вообще? Тебе действительно для какой-то
задачи не хватило обычного SQL?..
Хотел бы, чтобы хватало...
Как например решить такую задачу?
Код: plsql
1.
from mtable where cowner in (:Val1,:Val2..Valn)


Я заранее не знаю, сколько будет этих Val., может 3, а может пять... Как выкрутиться в этой ситуации?
...
Рейтинг: 0 / 0
10.08.2014, 16:22
    #38716805
noram
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dynamic Stored Procedures
Симонов Денисникаких динамических ХП в Firebird нет. Есть выполнение динамических запросов в рамках PSQL (оператор EXECUTE STATEMENT)
Наверное потому я и не смог ничего найти. Почитал про EXECUTE STATEMENT, информации много - да, применять эту эксекьюшку советуют только в крайнем случае.
Я ничего не утверждаю, я только спрашиваю совета. Значит, если я правильно понял, лучше написать 1000 ХП на все случаи жизни, чем несколько динамических?
...
Рейтинг: 0 / 0
10.08.2014, 16:25
    #38716806
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dynamic Stored Procedures
noramКак выкрутиться в этой ситуации?
Сложить все значения во временную таблицу ("хоть миллион, хоть миллиард" (с)), а потом
join с ней. ХП и динамический SQL тут не нужны.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
10.08.2014, 16:27
    #38716807
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dynamic Stored Procedures
noram,

1. Заталкивать Val1, Val2, ... ValN в GTT и делать с ней JOIN по полю фильтрации
2. Создать ХП SPLIT, которая бы принимала на вход строку состоящую из значений склеенных разделителем, а на выходе были бы разделённые значения и делать JOIN с этой ХП.

На форуме этот вопрос обсасывался 100500 раз.
...
Рейтинг: 0 / 0
10.08.2014, 16:38
    #38716808
noram
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dynamic Stored Procedures
Спасибо, буду разбираться...
...
Рейтинг: 0 / 0
11.08.2014, 04:13
    #38716926
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Dynamic Stored Procedures
Dimitry SibiryakovТогда зачем ты сразу полез в Dynamic SQL (который есть экзотика и не рекомендуется к
использованию в любой СУБД) и в хранимые процедуры вообще?


Эх, дать тебе волю - ХП отмерли б на корню, не говоря об execute statement ;) Ну ищет человек аналог sp_executesql (так кажись в MS это зовется). Он-то задачу не озвучил - пусть себе ищет, может оно ему действительно надо.

P.S. У меня на текущий момент обратная задача - перевод функционала системы на FB на рельсы MSSQL. Тот еще цирк.
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Dynamic Stored Procedures / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]