Запуск SQL запроса из Blob поля на сервере

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Mor
Сообщения: 14
Зарегистрирован: 20 июн 2005, 09:00

Запуск SQL запроса из Blob поля на сервере

Сообщение Mor » 20 июн 2005, 09:15

Нужно в хранимой процедуре запустить SQL запрос, хранящийся в Blob поле одной их таблиц. Подскажите как?

Лысый
Сообщения: 177
Зарегистрирован: 08 ноя 2004, 08:20

Сообщение Лысый » 20 июн 2005, 10:22

Попахивает извратом... не лучше ли это возложить на клиента? Тем более, если запрос кот. нужно выполнить должен возвращать какие-нибудь данные (их ведь в ХП как то объявить надо).

Mor
Сообщения: 14
Зарегистрирован: 20 июн 2005, 09:00

Сообщение Mor » 20 июн 2005, 10:47

Проще, но не лучше... Необходимо чтобы это выполнялось на сервере... :(

Лысый
Сообщения: 177
Зарегистрирован: 08 ноя 2004, 08:20

Сообщение Лысый » 20 июн 2005, 11:42

Опиши задачу подробнее, зачем это надо? Ну и версию серванта скажи...

Mor
Сообщения: 14
Зарегистрирован: 20 июн 2005, 09:00

Сообщение Mor » 20 июн 2005, 12:10

Лысый писал(а):Опиши задачу подробнее, зачем это надо? Ну и версию серванта скажи...
Блин, короче есть записи в базе, они отправляются с нашего серванта на верх через нет, перед отправкой их надо проверить на коекакие условия, при внесении их в нашу базу проверить нельзя. Условия проверки могут меняться, желательно чтобы ненадо было из-за этого лезть в базу (поэтому есть таблица с ошибками, именно в ней завёл блоб поле с проверкой на эту ошибку). Сервак - Фаербёрд 1.5.3.

Лысый
Сообщения: 177
Зарегистрирован: 08 ноя 2004, 08:20

Сообщение Лысый » 20 июн 2005, 12:18

Mor писал(а):Сервак - Фаербёрд 1.5.3.
Где взял?

Можешь посмотреть в сторону execute statment. Будет гемор с приведением типов из блоб. Мое имхо: делай проверку на клиенте, на сервере не есть гуд. Придут аксакалы - подтвердят...

Mor
Сообщения: 14
Зарегистрирован: 20 июн 2005, 09:00

Сообщение Mor » 20 июн 2005, 15:07

Туда параметр не передать... Впрочем я придумал коечто... :) Спс за наводку.

Лысый
Сообщения: 177
Зарегистрирован: 08 ноя 2004, 08:20

Сообщение Лысый » 20 июн 2005, 17:10

ну вот как знал не хотел про execute statment говорить.... :cry:

Mor
Сообщения: 14
Зарегистрирован: 20 июн 2005, 09:00

Сообщение Mor » 04 июл 2005, 08:55

Ещё трабла - как в хранимой процедуре подтвердить транзакцию? Дело в том, что я меняю тело другой хранимой процедуры из этой но пока транзакция не подтверждена эта вторая процедура остаётся старой...

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Сообщение hvlad » 04 июл 2005, 10:37

Никак
Перед тем, как начать писать процедуры, неплохобы сначала изучить инструмент и как с ним обращаться

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 04 июл 2005, 10:42

Ещё трабла - как в хранимой процедуре подтвердить транзакцию? Дело в том, что я меняю тело другой хранимой процедуры из этой но пока транзакция не подтверждена эта вторая процедура остаётся старой...
вообще бред, по многим параметрам.

1. операторы ddl можно выполнять только в отдельной транзакции, с обязательным commit после оператора. смешивание ddl и dml в одной транзакции не рекомендуется.

2. "изменить" процедуру из другой процедуры невозможно, и изменение rdb$procedure_source ничего не даст. нужно выполнять только оператор create/alter/recreate, чего в процедуре сделать нельзя.

3. существует кэш метаданных, который не меняется при alter procedure, если процедура используется. Читай доку (datadef.pdf, altering procedures in use.

Mor
Сообщения: 14
Зарегистрирован: 20 июн 2005, 09:00

Сообщение Mor » 04 июл 2005, 12:22

hvlad писал(а):Никак
Перед тем, как начать писать процедуры, неплохобы сначала изучить инструмент и как с ним обращаться
А можно воздержаться от подобных коментов? Проблема то нестандартная...

2kdv Я всё прекрасно понимаю, но тут выше изложено, что мне надо сделать, если транзакцию открыть и подтвердить внутри процедуры нельзя, то может у Вас есть идеи как мне решить мою проблему?

P.S. 2 - А вот и можно -

Код: Выделить всё

execute statement
'ALTER PROCEDURE TESTERR(
    ID_CAR INTEGER,
    ID_ORDER INTEGER)
RETURNS (
    ERROR INTEGER)
AS
begin
  /* Procedure Text */
ERROR=1;
Suspend;
end'
Тока бестолку, тока в отладчике работает, а так - транзакция... :?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 04 июл 2005, 12:57

А можно воздержаться от подобных коментов? Проблема то нестандартная...
воздержаться - нельзя. у сервера есть архитектура, и все действия с ним допустимы в контексте архитектуры. В IB/FB так, в MS SQL эдак, в Оракле еще как то.
2kdv Я всё прекрасно понимаю, но тут выше изложено, что мне надо сделать, если транзакцию открыть и подтвердить внутри процедуры нельзя, то может у Вас есть идеи как мне решить мою проблему?
в сад. нет никакой проблемы. ddl операторы ДОЛЖНЫ выполняться с клиента в ОТДЕЛЬНОЙ транзакции и завершаться COMMIT. Кроме того, все транзакции стартуют и завершаются только по инициативе клиента. Не нравится - переходи на другой сервер, который работает по другому. Или НЕ пытайся сделать так, как конкретный сервер не может и не должен. Грубо? Может быть. Зато правда.
P.S. 2 - А вот и можно -
execute statement
не можно. просто не запретили выполнять ddl в execute statement. я так понимаю, не дошли руки до того, чтобы это запретить. Поэтому "можно", только с непредсказуемыми последствиями.

Mor
Сообщения: 14
Зарегистрирован: 20 июн 2005, 09:00

Сообщение Mor » 04 июл 2005, 13:37

kdv писал(а):в сад. нет никакой проблемы. ddl операторы ДОЛЖНЫ выполняться с клиента в ОТДЕЛЬНОЙ транзакции и завершаться COMMIT. Кроме того, все транзакции стартуют и завершаются только по инициативе клиента. Не нравится - переходи на другой сервер, который работает по другому. Или НЕ пытайся сделать так, как конкретный сервер не может и не должен. Грубо? Может быть. Зато правда.
Баааалин! Написал же "тут выше имеется проблема", можно сначала прочитать то, что тут выше, а потом людей в сад посылать, а?
Нужно в хранимой процедуре запустить SQL запрос, хранящийся в Blob поле одной их таблиц. Подскажите как?
Блин, короче есть записи в базе, они отправляются с нашего серванта на верх через нет, перед отправкой их надо проверить на коекакие условия, при внесении их в нашу базу проверить нельзя. Условия проверки могут меняться, желательно чтобы ненадо было из-за этого лезть в базу (поэтому есть таблица с ошибками, именно в ней завёл блоб поле с проверкой на эту ошибку). Сервак - Фаербёрд 1.5.3.
Я вот про эту проблему. Нельзя транзакции - ПРЕКРАСНО, тогда как это сделать? Главная фигня в том, что в такой запрос нуно передать параметры...
P.S. А на счёт execute statement - даж в руководстве написано
Executes <string> as SQL operation thet does not return any data rows, vis. insert, update, delete, execute procedure or ANY DDL STATEMENT exept create/drop database
- почитай повнимательнее, такчто не руки недошли, а фишка это. (Firebird 1.5 realease notes v.1.08 Page 20)
Словами вашего же гуру - "Перед тем как админить форум неплохобы сначала изучить инструмент и т.д."... :) Без обид.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 04 июл 2005, 14:33

Баааалин! Написал же "тут выше имеется проблема", можно сначала прочитать то, что тут выше, а потом людей в сад посылать, а?
какая проблема, где? сначала придумываем какую-то муть, а потом пытаемся ее осуществить получая "проблему"?
Нужно в хранимой процедуре запустить SQL запрос, хранящийся в Blob поле одной их таблиц. Подскажите как?
ну допустим execute statement. И что? Если не смущает, что в общем плане это решение кривое, и разработчики FB уже давно стонут из-за того, что дали "в кривые руки" execute statement, то пожалуйста, используй....
Главная фигня в том, что в такой запрос нуно передать параметры...
ну ты ж читал relnotes. что тебе еще надобно?
- почитай повнимательнее, такчто не руки недошли, а фишка это.
кто бы кому указывал, где читать внимательнее, и что фича а что недоделка, и кто тут вообще гуру из присутствующих. :)

Mor
Сообщения: 14
Зарегистрирован: 20 июн 2005, 09:00

Сообщение Mor » 04 июл 2005, 15:19

Это проверки данных на локальном сервере перед отправкой на глобальный - муть? Мило... Также можно сказать, что рекурсия - муть, ветвления - муть и вообще нормальные перци пишут так:

Код: Выделить всё

mov ax,a
mov bx,b
add ax,bx
jnz AAA
...
AAA:
Я сам бы с большим удовольствием проверил в делфи, но заказчику надо чтоб на сервере...

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 04 июл 2005, 15:31

я вашей постановки задачи не читал, и чего там хочет заказчик, я не знаю. в общем случае детали реализации не всегда его, заказчика, дело.

к тому же я не вижу никакой связи между запросом в blob, execute statement, и "проверкой" данных локально перед отправкой на сервер.

более того, я надеюсь, что протокол связи приложения с сервером позволяет убедиться, что правила проверки и там и здесь одинаковы. Если дальше развивать эту мысль, то я не уверен в адекватности используемого решения. То есть, в "проверке" данных "локально" перед отправкой "на сервер".
В целом, объединяя все изложенные в этом топике намеки на конкретную реализацию, я бы мог дальше спросить "а почему не используется 2PC" и задать другие вопросы, но это, извините, будет консультация по проектированию.
Это проверки данных на локальном сервере перед отправкой на глобальный - муть? Мило... Также можно сказать, что рекурсия - муть, ветвления - муть и вообще нормальные перци пишут так:
не надо развивать то, чего мной не было сказано. Есть серверные проверки. Есть клиентские проверки. Синхронизация клиентских проверок с серверными - еще один вариант. Который сложнее. Как вы там его делаете и зачем - я не знаю. И опять же не вижу связи между используемыми выкрутасами и вскользь описанной постановкой задачи :)

Mor
Сообщения: 14
Зарегистрирован: 20 июн 2005, 09:00

Сообщение Mor » 04 июл 2005, 15:52

Данные на сервер идут в XML, на серваке оракул. Наше приложение работать может и на 2-х и на 3-х компах и вообще в WLAN на пол города с центральным офисом и филиалами. На счёт локальной проверки - передо мной лежит толмуд, на нем написано "Директор по организации поставок автомобилей, запчастей и техническому обслуживанию ____________ такойто", а дальше идёт таблица с описанием 50 проверок и 2-мя галочками 1 - проводится ли проверка на клиенте, 2 - проводится ли на сервере. ЗАЧЕМ это делается - вопрос к ВЦшникам ВАЗа, также как и почему они спроектировали такую ущербную БД работ по ремонту, я тут ни при чём, я таких бы вообще вешал. Короче в результате 20 минутного диспота с начальством я добился права реализовать ЭТО не на сервере БД, а там, где формируется XML. Всем спасибо за помощь.

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Re: Запуск SQL запроса из Blob поля на сервере

Сообщение hvlad » 04 июл 2005, 16:28

Mor писал(а):SQL запрос, хранящийся в Blob поле одной их таблиц
Это называется или STORED PROCEDURE, или TRIGGER, или VIEW.
Mor писал(а):Условия проверки могут меняться, желательно чтобы ненадо было из-за этого лезть в базу
Непонято: блоб меняется без того, чтобы лезть в базу ? :shock:

Так что - моя рекомендация остаётся в силе :wink:

Mor
Сообщения: 14
Зарегистрирован: 20 июн 2005, 09:00

Re: Запуск SQL запроса из Blob поля на сервере

Сообщение Mor » 05 июл 2005, 07:58

hvlad писал(а):Это называется или STORED PROCEDURE, или TRIGGER, или VIEW.

Непонято: блоб меняется без того, чтобы лезть в базу ? :shock:

Так что - моя рекомендация остаётся в силе :wink:
ЭТО называется запрос, мне не критично в какой он там форме, просто была идея сделать всё через процедуры. На данный момент там например:

Код: Выделить всё

  if (not exists(select * from ent e where e.vin =
                    (select c.vin3 from vcars c where c.id_car = :ID_CAR)
                 )) then begin
    CODE=5;
    suspend;
  end
Это по твоему называется "или STORED PROCEDURE, или TRIGGER, или VIEW"? Типа самый умный?
Блоб меняется без изменения метаданных. Такчто твоя рекомендация остаётся бредом...

Ответить