powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / UDF
18 сообщений из 18, страница 1 из 1
UDF
    #33953963
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужно сообразить
нечто а-ля
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
select
T1.Smth,
T2.Smth
from
Table1 T1,
Table2 T2
where
MyFunc(T1.Smth,T2.Smth)=Smth
Как можно выкрутиться?
Я так понял в СуБасе функцию родить нельзя...
А SP... Во-первых: из SP можно вернуть только int (по крайней мере так в букваре написано). Во-вторых: как ее тогда дергать?
Код: plaintext
1.
select Smth from StoredProcedure
тоже ж не прокатывает...
В общем: какие будут советы/предложения? Можно, конечно, все организовать в SP (родить временную таблицу, потом бегать по ней и дергать MyFunc), но, IMHO, ректально это как-то... А хочеться по-людськи...
select @@version
Adaptive Server Enterprise/12.5.1/EBF 11428/P/NT (IX86)/OS 4.0/ase1251/1823/32-bit/OPT/Wed Sep 17 11:10:54 2003

_________________
"Helo, word!" - 17 errors 56 warnings
...
Рейтинг: 0 / 0
UDF
    #33953986
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ex_SoftЯ так понял в СуБасе функцию родить нельзя...Ну когда люди запомнят что Sybase пишется только с одной большой буквой. И это фирма производящая несколько разных баз данных и много разных других продуктов поэтому нельзя использовать ее имя для обозначения какой-то своей базы данных.
Вот чисто из вредности: Можно в Sybase функцию родить! Запросто! Тебе на каком языке? Хочешь я ее тебе на Sybase PowerBuilder рожу? И попробуй только возмутится что это не "СуБасе".
...
Рейтинг: 0 / 0
UDF
    #33954173
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В ASE можно писать такие функции на Java. Для этого нужно только иметь ASE Java option, который имеет отдельную лицензию и стоит отдельных денег.
Будет почти так, как вы нарисовали.
Можно поставить себе developer edition и попробовать, устроит ли вас это.

Только хочу предупредить, что производительность такого запроса однозначно будет ну просто никакая. На маленьких таблицах только это сможет работать.
...
Рейтинг: 0 / 0
UDF
    #33954189
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl Ex_SoftЯ так понял в СуБасе функцию родить нельзя...Ну когда люди запомнят что Sybase пишется только с одной большой буквой. И это фирма производящая несколько разных баз данных и много разных других продуктов поэтому нельзя использовать ее имя для обозначения какой-то своей базы данных.
Вот чисто из вредности: Можно в Sybase функцию родить! Запросто! Тебе на каком языке? Хочешь я ее тебе на Sybase PowerBuilder рожу? И попробуй только возмутится что это не "СуБасе".
Поддерживаю - на Sybase ASA WatcomSQL тоже можно целую тонну функций родить и ХП в запросах юзать как таблицы ... нечего писать, что типа Sybase ничего не умеет - он все умеет, но не везде ;)
...
Рейтинг: 0 / 0
UDF
    #33954305
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гм... /me думает: вроде ж не пнятница...
White Owl
Ну когда люди запомнят что Sybase пишется только с одной большой буквой.

Если это для Вас настолько критично, давайте обсудим это здесь

White Owl
Тебе на каком языке? Хочешь я ее тебе на Sybase PowerBuilder рожу?

Во-первых:
Ex_Soft
А SP... Во-первых: из SP можно вернуть только int (по крайней мере так в букваре написано). Во-вторых: как ее тогда дергать?
Код: plaintext
1.
select Smth from StoredProcedure
тоже ж не прокатывает...
...
select @@version
Adaptive Server Enterprise/12.5.1/EBF 11428/P/NT (IX86)/OS 4.0/ase1251/1823/32-bit/OPT/Wed Sep 17 11:10:54 2003


IMHO, из контекста уже понятно, что речь идет об ASE 12.5.1, а не о PowerBuilder'е.
Во-вторых: топик открыт в Sybase ASA, ASE, IQ и если бы у меня возник вопрос: Как родить функцию в PowerBuilder'е , то, по крайней мере, я задал бы его в PowerBuilder

ASCRUS
на Sybase ASA WatcomSQL


Всегда указывайте наименование и версию СУБД (Sybase ASE, Sybase ASA или Sybase IQ)

Ex_Soft
select @@version
Adaptive Server Enterprise/12.5.1/EBF 11428/P/NT (IX86)/OS 4.0/ase1251/1823/32-bit/OPT/Wed Sep 17 11:10:54 2003


Ну?.. И где тут говориться о Sybase ASA WatcomSQL ?
MasterZiv
Для этого нужно только иметь ASE Java option, который имеет отдельную лицензию и стоит отдельных денег.
Будет почти так, как вы нарисовали.
Можно поставить себе developer edition и попробовать, устроит ли вас это.

Да нет... На такое никто не пойдет... Хотя бы потому, что необходимость в таком финте ушами вылезла впервые - до этого обходились как-то тем, что предоставляется штатно...
MasterZiv
Только хочу предупредить, что производительность такого запроса однозначно будет ну просто никакая. На маленьких таблицах только это сможет работать.

Да я в этом и не сомневался как бы... В том то и дело, что обрабатывать прийдется немерянные таблицы...
По сему - повторюсь: как выше поставленную задачу можно оптимально решить в ASE 12.5.1? (что посредством SP - это понятно) Просто пока в гольову пришел один вариант:
Ex_Soft
родить временную таблицу, потом бегать по ней и дергать MyFunc

М.б. ЭстЪ еще какие-то варианты решения?
_________________
"Helo, word!" - 17 errors 56 warnings
...
Рейтинг: 0 / 0
UDF
    #33954643
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ex_SoftА SP... Во-первых: из SP можно вернуть только int (по крайней мере так в букваре написано).
из SP можно вернуть столько и таких значений, сколько необходимо

create proc test;1
(@in int,
@out1 varchar(20) output,
@out2 int output,
@out3 money output)
as
begin
select @out1='nike', @out2=1,@out3=20
end
go

declare @o1 varchar(20),
@o2 int,
@o3 money
exec test 1, @out1=@o1 output, @out2=@o2 output, @out3=@o3 output
go
...
Рейтинг: 0 / 0
UDF
    #33954708
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
komrad
из SP можно вернуть столько и таких значений, сколько необходимо

говорилось в контексте
Ex_Soft
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
select
T1.Smth,
T2.Smth
from
Table1 T1,
Table2 T2
where
MyFunc(T1.Smth,T2.Smth)=Smth

сомнительно, что в конструкции такого рода можно заюзать каким-то макаром output параметры SP...
_________________
"Helo, word!" - 17 errors 56 warnings
...
Рейтинг: 0 / 0
UDF
    #33954725
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ex_Soft

сомнительно, что в конструкции такого рода можно заюзать каким-то макаром параметры SP...

никто не говорил что удастся
делайте через процу
...
Рейтинг: 0 / 0
UDF
    #33954757
moris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так к сведению:
в ближайшем будущем, а именно в ASE 15.0.2, наконец-то появятся User Defined Function на основе SQL.
...
Рейтинг: 0 / 0
UDF
    #33955657
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гм... Тривиальная, на первый взгляд, задача ввела мну в ступор
: как все это организовать-то?..

По идее напрашивается так:
1. Рожаем темповую таблицу
2. Организуем внешний цикл по Table1 курсором
3. Организуем внутренний цикл по Table2 курсором
4. Все строки у которых (exec @ret=MyFunc(T1.Smth,T2.Smth))=Smth записываем в темповую таблицу

Но уж очень это, IMHO, ректально... :( Можно ли как-то это организовать более по людськи?... М.б. в ASE 12.5.1 ЭстЪ какие-то специфичные фичи, о которых я не знаю, с помощью которых это можно организовать более эстетичнее? Как люди выкручиваются из подобных ситуаций? Или ни у кого никогда не возникало потребности забалабенить такое?

TIA
_________________
"Helo, word!" - 17 errors 56 warnings
...
Рейтинг: 0 / 0
UDF
    #33955796
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ex_SoftГм... Тривиальная, на первый взгляд, задача ввела мну в ступор
: как все это организовать-то?..

По идее напрашивается так:
1. Рожаем темповую таблицу
2. Организуем внешний цикл по Table1 курсором
3. Организуем внутренний цикл по Table2 курсором
4. Все строки у которых (exec @ret=MyFunc(T1.Smth,T2.Smth))=Smth записываем в темповую таблицу

Но уж очень это, IMHO, ректально... :( Можно ли как-то это организовать более по людськи?... М.б. в ASE 12.5.1 ЭстЪ какие-то специфичные фичи, о которых я не знаю, с помощью которых это можно организовать более эстетичнее? Как люди выкручиваются из подобных ситуаций? Или ни у кого никогда не возникало потребности забалабенить такое?

TIA
_________________
"Helo, word!" - 17 errors 56 warnings

можно выдрать результат запроса без этого where в темповую таблицу, по ней открыть курсор и позаписно анализировать данные, перекидывая (допустим) в другую темповую подходящие записи

имхо
конечно, делать надо с оглядкой, а то может у вас там записей мульёны
...
Рейтинг: 0 / 0
UDF
    #33956243
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
komrad
можно выдрать результат запроса без этого where в темповую таблицу
...
конечно, делать надо с оглядкой, а то может у вас там записей мульёны

в том то и дело, что мульены...
по сему нуна это оптимизировать как по скорости, так и по обЪему данных, закачиваемых в темповую таблицу. Потому как если закачать туда все, а потом там шеволиться...
_________________
"Helo, word!" - 17 errors 56 warnings
...
Рейтинг: 0 / 0
UDF
    #33957183
sn1251
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ex_Soft komrad
можно выдрать результат запроса без этого where в темповую таблицу
...
конечно, делать надо с оглядкой, а то может у вас там записей мульёны

в том то и дело, что мульены...
по сему нуна это оптимизировать как по скорости, так и по обЪему данных, закачиваемых в темповую таблицу. Потому как если закачать туда все, а потом там шеволиться...

А почему именно на функции свет клином сошелся? Во вьюшку расчет значения этой MyFunc() по произведению таблиц вынести нельзя?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
create view View1 as 
select
  T1.Smth as T1_Smth,
  T2.Smth as T2_Smth,
  /* выражение эквивалентное MyFunc(T1.Smth,T2.Smth) */ as MyFunc
from
  Table1 T1,
  Table2 T2
----
select T1_Smth, T2_Smth from View1 where MyFunc=Smth
Тормоза конечно будут, но ровно такие же, как и при использовании "настоящей" функции.



morisТак к сведению:
в ближайшем будущем, а именно в ASE 15.0.2, наконец-то появятся User Defined Function на основе SQL.Ура, ура. Не прошло и 8 лет :-)) Жаль только, что 15 версию использовать уже некому будет. Просрали, всё просрали, долбо..ы (с) Горчев
...
Рейтинг: 0 / 0
UDF
    #33957267
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ex_Soft

По идее напрашивается так:
1. Рожаем темповую таблицу
2. Организуем внешний цикл по Table1 курсором
3. Организуем внутренний цикл по Table2 курсором
4. Все строки у которых (exec @ret=MyFunc(T1.Smth,T2.Smth))=Smth записываем в темповую таблицу



Да просто нужно запрос на JOIN написать и все. Если условия JOIN-а меняются, надо запросы налету генерировать и выполнять. Это -- единственный способ уйти от O( N*M ) . Хотя бы в некоторых случаях.

Если нужно, можно общую часть JOIN-а вынести в определение VIEW, и на его основе уже генерировать финальный запрос.

Короче -- меняй постановку задачи, думай на SQL.
...
Рейтинг: 0 / 0
UDF
    #33959531
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sn1251
А почему именно на функции свет клином сошелся? Во вьюшку расчет значения этой MyFunc() по произведению таблиц вынести нельзя?

IMHO - нЭт

MasterZiv
Да просто нужно запрос на JOIN написать и все. Если условия JOIN-а меняются, надо запросы налету генерировать и выполнять. Это -- единственный способ уйти от O( N*M ) . Хотя бы в некоторых случаях.

Если нужно, можно общую часть JOIN-а вынести в определение VIEW, и на его основе уже генерировать финальный запрос.

IMHO, JOIN'ы, VIEW'хи тоже не прокатят...
MasterZiv
Короче -- меняй постановку задачи, думай на SQL.

Гм... Тогда я лучче опишу постановку задачи, мо что-то всем миром надумаем

Преамбула.
Производиться импорт, 4 example, контрагентов. Данные заносятся в промежуточную таблицу. Из всего, что имеем: Ф.И.О., ДР, адрес
. Предваряя флейм на предмет скудности данных: для заключения договора страхования - это все, что необходимо знать о страхователе ф/л. Более того, если, 4 example, страхователем является ю/л, и оно страхует скопом всех своих сотрудников, то застрахованные лица подаются вообще в приложении к договору в виде списка и там даже адрес может отсутствовать.
Амбула.
Срок действия договора 1 год. Соответственно каждый год заключается новый договор. Поэтому контрагенты, как правило, практически одни и теже.
Необходимо вычленить из промежуточной таблицы контрагентов, которые уже существуют в основной таблице контрагентов. Поскольку люди набирают кто во что горазд, то для того, что бы наиболее точно сравнить используется следующий алгоритм:
Код: plaintext
1.
2.
3.
4.
5.
 1 . Производится замена импортных буковок, сходных по начертанию, на наши - сравниваем. Если не равно п.  2 .
 2 . Переводиться все в один регистр - сравниваем. Если не равно п.  3 .
 3 . Удаляются пробелы - сравниваем. Если не равно п.  4 .
 4 . Удаляются all non-alphanumeric characters, including punctuation  - сравниваем. Если не равно п.  5 .
 5 . Удаляются гласные - сравниваем. Если не равно - кердык [img=http://www.sql.ru/forum/images/cry.gif]
Данная методика опробована, юзается, и дает неплохие результаты.
На основе выше описанного алгоритма простенькая SP
Код: plaintext
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.
create procedure CmpStr
  @str1 varchar( 1024 ),
  @str2 varchar( 1024 )
as
begin
  if @str1=@str2
    return( 0 )

  exec ConvEng2Rus @str1,@str1 output
  exec ConvEng2Rus @str2,@str2 output
  if @str1=@str2
    return( 0 )

  set @str1=upper(@str1)
  set @str2=upper(@str2)
  if @str1=@str2
    return( 0 )

  exec DelSpace @str1,@str1 output
  exec DelSpace @str2,@str2 output
  if @str1=@str2
    return( 0 )

  exec DelNotLetter @str1,@str1 output
  exec DelNotLetter @str2,@str2 output
  if @str1=@str2
    return( 0 )

  exec DelVowel @str1,@str1 output
  exec DelVowel @str2,@str2 output
  if @str1=@str2
    return( 0 )

  return( 1 )
end
Вот теперь, на основании всего выше сказанного, нуна родить SP, которая на выходе даст список контрагентов из промежуточной и боевой таблиц, для которых CmpStr возвернуло 0.
И все это нуна оптимизировать с точки зрения увеличения быстродействия и уменьшения ресурсоемкости.
Какие будут идеи/предложения?
_________________
"Helo, word!" - 17 errors 56 warnings
...
Рейтинг: 0 / 0
UDF
    #33959648
just_me
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
То, что делает эта процедура можно IMHO представить как:

Обычное соединение через UNION ALL нескольких запросов с джойнами по выражению.
Естественно это будет тормозить.
Поэтому как вариант вычислять сразу выражения (например, триггером при вставке) и джойнить потом эту радость несколькими запросами с объединением через UNION ALL.
...
Рейтинг: 0 / 0
UDF
    #33959802
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
just_me
Поэтому как вариант вычислять сразу выражения (например, триггером при вставке) и джойнить потом эту радость несколькими запросами с объединением через UNION ALL.

Вариант создания дополнительных полей, содержащих промежуточные трансформации с формированием их триггером как бы рассматривался. Конечно, в этом случае, действительно можно обойтись без выпендрежа с SP a-la UDFчистыми запросами и UNION'ами. Скорее всего, таки, склонимся к этому варианту - потому как даже разбухание БД за счет 5-ти доп полей (на каждый этап сравнения) меньшее зло, чем тормоза при выше предложенном (SP с двумя курсорами) варианте.
Мо у кого ышо ЭстЪ какие-нить идеи/предложения?
_________________
"Helo, word!" - 17 errors 56 warnings
...
Рейтинг: 0 / 0
UDF
    #33960584
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Последовательно из импортрой таблицы делается временная таблица для
каждого из этих пунктов:

asdf
1. Производится замена импортных буковок, сходных по начертанию, на наши - сравниваем. Если не равно п. 2.
2. Переводиться все в один регистр - сравниваем. Если не равно п. 3.
3. Удаляются пробелы - сравниваем. Если не равно п. 4.
4. Удаляются all non-alphanumeric characters, including punctuation - сравниваем. Если не равно п. 5.
5. Удаляются гласные - сравниваем. Если не равно - кердык


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

Совпавшие записи удаляются. И не участвуют в следующем пункте. и так далее, всего пять раз. Тупо, примитивно, но будет работать быстро.
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / UDF
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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