|
Sybase
|
|
|
|
|
Продукты
|
|
|
|
|
Сообщества
|
|
|
|
|
Меню
|
|
|
|
|
Вход
|
|
|
|
|
Рассылка
|
|
|
|
|
Статистика
|
|
|
|
|
Как получить в процедуре набор данных, формируемый в другой процедуре.
|
Как получить в процедуре набор данных, формируемый в другой процедуре.Иногда бывает так, что есть процедура, которая формирует и возвращает клиенту какой-то набор данных (result set), и хочется, повторно используя код этой процедуры, получить этот набор данных в другую процедуру и там возможно как-то еще его обработать.
В ближайщем родственнике ASE, в MSSQLServer (кажется начиная с версии 6.0) существует вариант команды INSERT для вставки в таблицу набора данных, возвращаемого хранимой процедурой :
insert into <tablename> exec[ute] <procedure name>
Sybase ASE не имеет такого варианта комманды INSERT ни со статическим вариантов EXEC, ни с динамическим.
Хотелось бы заметить, что в большинстве случаев возможно использование только одного набора данных из хранимой процедуры и чаще всего структура этого набора данных строго фиксирована.
Для реализации этой возможности в ASE надо рассмотреть альтернативные варианты решения задачи.
- замечание от MasterZiv Я лично хочу заметить, что по моему убеждению, сложившемуся за годы работы с SQL, SQL - это язык немодульный, в том смысле, что в нем практически нет возможностей повторного использования кода и попытки повторного испоьлзования кода часто бывают даже вредны (например для производительности). Так что первый вариант решения - просто скопировать текст запроса или использовать такие средства "размножения кода", как макропроцессоры.
- Рассмотреть возможность использования VIEW. Это подходит только в случаях достаточно несложных запросов - JOIN-ов может быть сколько угодно, главное чтобы не было сложных операций типа множественных вложенных подзапросов или реляционного вычитания.
- Рассмотреть возможность использовать временную, псевдовременную или постоянную таблицу для промежуточного хранения данных. Кстати, в этом варианте процедура может формировать несколько наборов данных в разных таблицах. При этом код исходной процедуры помещается в ещё одну процедуру -- процедуру-реализацию, которая складывает данные в выходную таблицу, а остальные процедуры либо выдают эти данные клиенту, либо используют их как-то еще.
- Использовать CIS proxy table. Это возможность CIS (component integration service) позволяет представлять внешние по отношению к ASE источники данных в виде псевдо-таблиц в TSQL. Proxy-таблицы могут создаваться на таблицы, представления (views) и хранимые процедуры. Источниками данных могут быть любые СУБД, для которых есть т.н. коннекты (доп. модули) и все СУБД от Sybase, работающие по технологии OpenClient. Возможность работы с другими серверами Sybase (ASE,ASA и ASIQ) входит в базовую поставку ASE. Также есть возможность создать т.н. loopback-сервер - соединение CIS, обращающееся к самому себе, к тому же серверу, с которого идет обращение. И наконец, работая через loopback-сервер, можно сделать proxy-таблицу на любую процедуру и использовать эту proxy-таблицу в другой процедуре. Последовательности действий вкратце следующие :
-- сконфигурировать CIS
-- создать loopback-сервер
-- создать proxy-таблицу на процедуру. При этом прочитайте в документации особенности работы таких таблиц - в них первичный ключ соответствует параметрам процедуры, а атрибуты - набору данных, возвращаемому процедурой.
В заключении код может выгдядеть подобным образом :
create procedure testproc
@namelike varchar(50)
as select id, name from sysobjects where name like @namelike
go
create existing table proxy_testproc (
id int,
name varchar(30),
_namelike varchar(50) null,
) external procedure at 'local.your_database_name.dbo.testproc'
go
select * from proxy_testproc where _namelike='sysc%'
go
select * into #tmp from proxy_testproc where _namelike='sysc%'
go
select * from #tmp
go
Особенности решения с использованием CIS : возможны доп. ограничения, вызванные использованием CIS, производительность может быть низкой.
|
Дата публикации: Wednesday 29 March 2006 12:42:51 Материал прочитан: 11711 раз(а) [ Назад ] |
|
|
|
|
|
|
Copyright©2005 . Все права защищены.
|