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

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

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

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

Вход

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


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

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

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

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

Иногда бывает так, что есть процедура, которая формирует и возвращает клиенту какой-то набор данных (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
Материал прочитан: 11138 раз(а)
[ Назад ]



Продвижение сайтов
Биржа ссылок

Copyright©2005 phpMS. Все права защищены.
hosted on pets-tree