Форум FAQ О команде
Поиск по сайту:
 
Sybase
Sybase ASA  
Sybase ASE  
Sybase IQ  
Sybase PowerDesigner  
Sybase PowerBuilder  

Продукты
Наши продукты  
Продукты партнеров портала  

Сообщества
Alef community  

Меню
Регистрация  
Почта  

Вход

Рассылка
Рассылка 'РСУБД Sybase ASA 9 - мощность, легкость и надежность'
Почтовая рассылка
"Технологии обработки данных компании Sybase"


Статистика
Яндекс цитирования

Rambler's Top100
Находится в каталоге Апорт

Главная -> Статьи
Как получить в процедуре набор данных, формируемый в другой процедуре.

Как получить в процедуре набор данных, формируемый в другой процедуре.

Иногда бывает так, что есть процедура, которая формирует и возвращает клиенту какой-то набор данных (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 phpMS. Все права защищены.
hosted on pets-tree