Как выбрать из хранимой процедуры в Sybase?
мой DBA построил мне хранимую процедуру в базе данных Sybase, для которой у меня нет определения. Если я запускаю его, он возвращает ResultSet с набором столбцов и значений. Я хотел бы выбрать далее, чтобы уменьшить строки в результирующем наборе. Возможно ли это?
с этот вопрос кажется, я мог бы вставить результаты во временную таблицу, но я не уверен, что у меня есть разрешения на это.
есть ли способ, которым я могу выбрать определенный строк, или если нет, может кто-нибудь дать мне пример кода для моделирования с временной таблицей?
7 ответов
вам нужно будет попросить DBA изменить хранимую процедуру.
вы можете изменить его, чтобы выбрать результаты во временную таблицу rater, чем простой выбор, а затем вы можете написать свой собственный выбор в этой временной таблице, чтобы вернуть только строки, которые вы хотите
в 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
под Sybase IQ (12.6 и выше, по крайней мере) вы можете выбрать из хранимой процедуры и фильтровать результаты, как если бы это была таблица. Я не знаю, работает ли это под ASE или ASA, но вы можете попробовать.
поэтому, если хранимая процедура называется myproc, результирующий набор имеет активный столбец, который может быть 0 или 1, и вы хотите выбрать только активные строки = 1, которые вы можете сделать это.
выберите * из myproc (), где ACTIVE = 1
под IQ вы можете также используйте это как производную таблицу и соедините ее с другими таблицами, например, как это...
выберите t1.имя, t1.адрес,t2, активный Из tbl_atable t1, (Выберите * из myproc (), где ACTIVE = 1) t2 Где t1.active = t2.активный
...что это здорово!
Я надеюсь, что это работает для какой-либо версии Sybase вы работаете.
это возможно с ASE, но довольно окольным путем, используя таблицы CIS и proxy. Механизм очень хорошо описан на сайте Роба Вершура:
http://www.sypron.nl/proctab.html
однажды я попробовал это как любопытство, и действительно это работает. Я не стал углубляться в сложный вопрос об обработке ошибок.
pjjH
насколько я знаю, это невозможно в Sybase ASE. Даже используя
insert #temp_table
exec my_procedure
не работает (по крайней мере, на sybase 12.икс.)
просто мысли.
возможно, ваш DBA мог бы подготовить представление вместо хранимой процедуры, если бы он хотел, чтобы вы по какой-то причине не смотрели на внутренний материал или не беспокоились об этом.
другой подход - Увидеть текст хранимой процедуры (если он не зашифрован) с помощью sp_helptext и переписать его для собственных целей (например. в представление), чтобы иметь возможность применять дополнительное кондиционирование к resultset.
в Sybase IQ вы можете сделать следующее:
выберите , от (''), где
пример:
выберите объект, DbspaceName, ObjSize из sp_iqindexinfo ('table xyz'), где объект, как " %col1_indx%"