Как выбрать из хранимой процедуры в Sybase? - PullRequest
6 голосов
/ 18 сентября 2009

Мой администратор БД построил мне хранимую процедуру в базе данных Sybase, для которой у меня нет определения. Если я запускаю его, он возвращает набор результатов с набором столбцов и значений. Я хотел бы выбрать еще, чтобы уменьшить количество строк в наборе результатов. Возможно ли это?

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

Можно ли как-то ВЫБРАТЬ определенные строки, или, если нет, может кто-нибудь дать мне пример кода для моделирования с временной таблицей?

Ответы [ 7 ]

4 голосов
/ 19 октября 2012

В Sybase ASE мы можем использовать этот хак для выбора из хранимой процедуры через «таблицу прокси»:

http://www.sypron.nl/proctab.html

Пример:

sp_addserver loopback, null, @@servername
go

create existing table
sp_test12 (
    Document_Name varchar(100),
    Required_Status varchar(5),
    Doc_ID varchar(10),
    OrderBy int,
    No_of_Copy_Retain int,
    _p_EPEB_ID varchar(10) null,
    _p_MY_NAME varchar(3)  null,
    _p_MY_NO varchar(10)   null,
    _p_EPEB_EDATE datetime null,
    _TXN varchar(10)  null,
    _SUBTXN varchar(15)  null,
    _OwnType_ID1 varchar(5)  null,
    _OwnType_ID2 varchar(5)  null,
    _blnflag int null
)
external procedure
at 'loopback.MYDB.dbo.usp_xyz'
go

select 
Doc_ID, No_of_Copy_Retain, _p_EPEB_ID, _p_EPEB_ID, _p_MY_NAME, _p_MY_NO
from #sp_test12
where
    _p_EPEB_ID='EPEB1508'
    and _p_MY_NAME='107'
    and _p_MY_NO='2011000045'
    and _p_EPEB_EDATE='2011-01-15 15:03:03.0'
    and _TXN='TX012'
    and _SUBTXN='TX012.001'
    and _OwnType_ID1='ASSN'
    and _OwnType_ID2='ASSN'
    and _blnflag=0
go
2 голосов
/ 24 сентября 2009

Это возможно с ASE, но довольно окольным способом с использованием таблиц CIS и прокси. Механизм очень хорошо описан на сайте Роба Вершура:

http://www.sypron.nl/proctab.html

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

pjjH

2 голосов
/ 24 сентября 2009

В Sybase IQ (минимум 12,6 и выше) вы можете выбрать хранимую процедуру и отфильтровать результаты, как если бы это была таблица. Я не знаю, работает ли это под ASE или ASA, но вы можете попробовать.

Таким образом, если ваша хранимая процедура называется myproc, а в наборе результатов есть столбец ACTIVE, который может быть 0 или 1, и вы хотите выбрать только строки ACTIVE = 1, вы можете сделать это.

ВЫБРАТЬ * ИЗ myproc () ГДЕ АКТИВНО = 1

В IQ вы также можете использовать это как производную таблицу и объединить ее с другими таблицами, например, такими как ...

ВЫБЕРИТЕ t1.name, t1.address, t2, active ОТ tbl_atable t1, (ВЫБЕРИТЕ * ИЗ myproc () ГДЕ АКТИВНО = 1) t2 ГДЕ t1.active = t2.active

... что-то вроде аккуратно!

Я надеюсь, что это работает для любой версии Sybase, которую вы используете.

2 голосов
/ 19 сентября 2009

Вам нужно будет попросить администратора базы данных изменить хранимую процедуру.

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

2 голосов
/ 18 сентября 2009

Насколько я знаю, это невозможно в Sybase ASE. Даже используя

insert #temp_table
exec my_procedure

не работает (по крайней мере, на sybase 12.x).

1 голос
/ 21 января 2013

Просто мысль.

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

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

0 голосов
/ 11 августа 2014

В Sybase IQ вы можете сделать это:

выберите , из (''), где <предикат>

Пример:

выберите Object, DbspaceName, ObjSize из sp_iqindexinfo ('table xyz'), где Object подобен '% col1_indx%'

...