Как выбрать из хранимой процедуры в 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%"