2009-09-18 8 views
6

Mein DBA hat mir eine gespeicherte Prozedur in einer Sybase-Datenbank erstellt, für die ich die Definition nicht habe. Wenn ich es ausführe, gibt es eine Ergebnismenge mit einer Reihe von Spalten und Werten zurück. Ich möchte weiter SELECT, um die Zeilen in der Ergebnismenge zu reduzieren. Ist das möglich?Wie wähle ich aus einer gespeicherten Prozedur in Sybase aus?

Von this question scheint es, als ob ich die Ergebnisse in eine temporäre Tabelle einfügen könnte, aber ich bin mir nicht sicher, dass ich dazu berechtigt bin.

Gibt es eine Möglichkeit, bestimmte Zeilen auszuwählen, oder wenn nicht, kann mir jemand Beispielcode für die Simulation mit einer temporären Tabelle geben?

Antwort

2

Sie müssen den DBA bitten, die gespeicherte Prozedur zu ändern.

Sie erhalten könnte es geändert, um die Ergebnisse in eine temporäre Tabelle rater wählen als eine Ebene auswählen und dann können Sie sich auf dieser temporären Tabelle Ihr eigenes wählen schreiben nur die Zeilen, die Sie

2

Soweit ich weiß, ist dies in Sybase ASE nicht möglich. Selbst mit

insert #temp_table 
exec my_procedure 

funktioniert nicht (zumindest auf Sybase 12.x).

2

unter Sybase IQ zurückkehren wollen (12.6 und mindestens höher) Sie können aus einer gespeicherten Prozedur auswählen und die Ergebnisse filtern, als ob es eine Tabelle wäre. Ich weiß nicht, ob dies unter ASE oder ASA funktioniert, aber Sie könnten es versuchen.

Wenn also die gespeicherte Prozedur myproc heißt, hat die Ergebnismenge eine Spalte ACTIVE, die entweder 0 oder 1 sein kann und Sie nur die ACTIVE = 1 Zeilen auswählen möchten, die Sie tun könnten.

SELECT * FROM myproc() WHERE ACTIVE = 1

Unter IQ Sie auch dies als eine abgeleitete Tabelle verwenden können und es mit anderen Tabellen zum Beispiel wie folgt aus JOIN ...

SELECT t1.name , t1.address, t2, aktiv vON tbl_atable t1, (SELECT * FROM myproc() WHERE ACTIVE = 1) t2 WHERE t1.active = t2.active

... die Art von ordentlich ist!

Ich hoffe, dass funktioniert, für welche Version von Sybase Sie laufen.

2

Es ist möglich mit ASE, aber in einer eher umständlichen Weise mit CIS und Proxy-Tabellen. Der Mechanismus ist sehr gut beschrieben auf Rob Verschoor Website:

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

ich es ausprobiert einmal als Kuriosität und in der Tat funktioniert es. Ich habe mich nicht mit der kniffligen Frage der Fehlerbehandlung beschäftigt.

pjjH

+0

Danke, es funktioniert. Sybase ASE ist verrückt. –

3

In Sybase ASE, können wir diesen Hack verwenden, um von einer gespeicherten Prozedur über eine "Proxy-Tabelle" wählen:

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

Beispiel:

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 
+1

Das funktioniert. Sybase ist verrückt. –

1

Nur ein Gedanke.

Vielleicht könnte Ihr DBA eine Ansicht statt einer gespeicherten Prozedur vorbereiten, wenn er Sie aus irgendeinem Grund nicht auf die inneren Sachen schauen oder sich darum kümmern wollte. Ein anderer Ansatz wäre, den gespeicherten Prozedurentext (wenn nicht verschlüsselt) mit sp_helptext zu sehen und ihn für Ihre eigenen Zwecke (z. B. in eine Ansicht) neu zu schreiben, um eine zusätzliche Konditionierung auf das Resultset anwenden zu können.

0

In Sybase IQ, können Sie dies tun:

< col1 wählen>, < col2> von < sp_name> ('< sp_arg>'), wo < Prädikat>

Beispiel:

Wählen Sie Object, DbspaceName, ObjSize aus sp_iqindexinfo ('Tabelle xyz'), wobei Objekt wie '% col1_indx%'