Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 16.10.2008, 13:37
dbgrid dbgrid вне форума
Прохожий
 
Регистрация: 01.10.2008
Сообщения: 7
Репутация: 10
Вопрос вызов функции из SQL запроса

здравствуйте уважаемые

хотелосьбы сделать нечто подобное)))
//************************************************** ***
sql:='update table1 set a=1, b=2, c=f1(a,b) ';
ADOCommand1.CommandText:=sql;
ADOCommand1.Execute;

....


function f1(a,b:integer):integer;
begin;
...
...
...
result:=...;
end;
//************************************************** ***

т.е. из sql запроса вызывать функцию из программы, причём в качестве аргументов пересалать данные из таблица (а, b)
как это можно организовать???
Ответить с цитированием
  #2  
Старый 16.10.2008, 20:43
Аватар для Appolon
Appolon Appolon вне форума
Новичок
 
Регистрация: 10.01.2008
Адрес: гЕйск
Сообщения: 76
Репутация: 16
По умолчанию

Немного не понятно конечно.
Но постораюсь. А может что типа вот этого подойдет??
Код:
sql:='update table1 set a=1, b=2, c=' +IntToStr(f1(a,b));
ADOCommand1.CommandText:=sql;
ADOCommand1.Execute;
....

function f1(a,b:integer):integer;
begin;
...
result:=...;
end;
А какие именно действия выполняет фунция??
__________________
From VasYa with LoVe...
Ответить с цитированием
  #3  
Старый 17.10.2008, 09:50
dbgrid dbgrid вне форума
Прохожий
 
Регистрация: 01.10.2008
Сообщения: 7
Репутация: 10
По умолчанию

спасибо за ответ
НО....
в функцию fun1(a,b) не будут переданы переменные a и b т.к. они являются именами полей таблицы table1 и обращение к ним возможно только в теле sql запроса
sql:='тело sql запроса' + внешнии функции;
в этом-то как раз и кроется вся проблема как из тела sql запроса сделать вызов функции используя данные полей таблицы...
Ответить с цитированием
  #4  
Старый 17.10.2008, 10:31
san-46 san-46 вне форума
Активный
 
Регистрация: 25.04.2008
Сообщения: 383
Репутация: 33
По умолчанию

Что такое SQL запрос? Это СТРОКА. Delphi не имеет механизма макросов и вызовы процедур из строки не выполнимы (строка для компилятора прозрачна).
Кто мешает после выполнения запроса вызвать ту же функцию f1 и передать ей в качестве параметров результат запроса?
__________________
Не забывайте делать резервные копии
Ответить с цитированием
  #5  
Старый 17.10.2008, 13:05
dbgrid dbgrid вне форума
Прохожий
 
Регистрация: 01.10.2008
Сообщения: 7
Репутация: 10
По умолчанию

ситуация следующая, ...
есть таблица table1, в ней 3 поля, A,B,C причём A и B поля мы заполняем а С вычисляется по очень сложному алгоритму)))настолько сложному что в sql запрос поместить весь алгоритм нельзя))поэтому алгоритм расчёта поля С выведен в отдельную функцию аргументами которой является информация из полей A и B,
для каждой записи в таблице свои данные полей A и B а соответственно и C

есть вариант перебора по порядку всех записей таблицы , расчёта, и занесения данных в поле C, но это во-первых громоздко, во вторых, при большой БД это занимает много время, поэтому хотелось бы весь расчёт поля C вывести в sql запрос, со ссылкой на внешнюю функцию

уфффф, всё)))
Ответить с цитированием
  #6  
Старый 17.10.2008, 13:11
san-46 san-46 вне форума
Активный
 
Регистрация: 25.04.2008
Сообщения: 383
Репутация: 33
По умолчанию

Такие вещи в SQL базах делаются в хранимых процедурах (Stored procedure).
__________________
Не забывайте делать резервные копии
Ответить с цитированием
  #7  
Старый 17.10.2008, 13:54
dbgrid dbgrid вне форума
Прохожий
 
Регистрация: 01.10.2008
Сообщения: 7
Репутация: 10
По умолчанию

ну инфу по хранимым процедурам нашёл, вроде как похоже на правду, ща позаморачиваюсь, надеюсь что разберусь)
потом отпишусь)
Ответить с цитированием
  #8  
Старый 17.10.2008, 15:33
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,029
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну, можно и сделать в виде функции.
только функция должна возвращать СТРОГО одно значение.

Далее поверх таблицы, состоящей, кстати, только из 2х полей (а, b), делаем вьюху, которая и будет в качестве третьего поля собержать вызов функции. Если вью надо апдейтить, то пишешь соотв. триггер на нее.

Преимущества. Расчет будет производиться только для реально выбранных записей. при отсутсвии необходимости третьего значения можно заселектиться прямо из таблицы.

Недостатки. Расчет будет производиться каждый раз,к огда получается запись из этой вью.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 14:57.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter