2010-08-19 10 views
15

MS SQL Server'da, Saklanmış bir yordamdan sonuçları kontrol etmek istiyorsanız, Management Studio'da aşağıdakileri uygulayabilirim. Sonuçlar bölmesindeki çıktı buna benzer olabilir.Referans imleci döndüren bir Oracle prosedüründen nasıl biçimlendirilmiş sonuçlar elde edersiniz?

ID Title            ViewCount Votes 
----- ------------------------------------------------- ---------- -------- 
2165 Indexed View vs Indexes on Table     491   2 
5068 SQL Server equivalent to Oracle’s NULLS FIRST  524   3 
1261 Benefits Of Using SQL Ordinal Position Notation? 377   2 

(3 row(s) affected) 

döngüler veya BASKI ifadeleri yazmaya gerek yok.

Ben

--ORACLE WAY 
    DECLARE 
     OUTPUT MYPACKAGE.refcur_question; 
     R_OUTPUT MYPACKAGE.r_question; 
     USER VARCHAR2(20); 

BEGIN 

    dbms_output.enable(10000000); 
    USER:= 'OMG Ponies'; 
    recordCount := 0; 



    MYPACKAGE.GETQUESTIONS(p_OUTPUT => OUTPUT, 
    p_USER=> USER, 

) ; 




    DBMS_OUTPUT.PUT_LINE('ID | Title | ViewCount | Votes'); 

    LOOP 
    FETCH OUTPUT 
    INTO R_OUTPUT; 

     DBMS_OUTPUT.PUT_LINE(R_OUTPUT.QUESTIONID || '|' || R_OUTPUT.TITLE 
       '|' || R_OUTPUT.VIEWCOUNT '|' || R_OUTPUT.VOTES); 
      recordCount := recordCount+1; 




EXIT WHEN OUTPUT % NOTFOUND; 
     END LOOP; 
     DBMS_OUTPUT.PUT_LINE('Record Count:'||recordCount); 
     CLOSE OUTPUT; 


    END; 

Bu çıkışlar

ID|Title|ViewCount|Votes 
2165|Indexed View vs Indexes on Table|491|2 
5068|SQL Server equivalent to Oracle’s NULLS FIRST|524|3 
1261|Benefits Of Using SQL Ordinal Position Notation?|377|2 
Record Count: 3 

Yani SQL sürüm 1 hattı vardır ve oracle 18 var gibi SQL Developer aşağıdaki anonim blok yürütmek olabilir Oracle aynı şeyi yapmak için ve çıktı çirkin. Çok fazla sütun varsa ve/veya veri sayısalsa, daha da şiddetlenir.

Ne bana bu konuda garip SQL Geliştirici veya Yönetim stüdyoda birinde bu ifadeyi ...

SELECT 
ID, 
Title, 
ViewCount, 
Votes 
FROM votes where user = 'OMG Ponies' 

yazarsanız sonuçlar oldukça benzer olmasıdır. Bu bana ya bir teknik eksik ya da yanlış bir araç kullandığımı hissettiriyor.

cevap

16

GetQuestions, o zaman oldukça böyle bir şey yapmak mümkün olabilir SQL Server sürümünde ne gibi görünüyor bir refcursor, dönen bir işlevdir:

select * from table(MyPackage.GetQuestions('OMG Ponies')); 

Veya eğer sen lüzum Bir PL/SQL bloğunda, aynı seçmeyi bir imleçte kullanabilirsiniz.

Ayrıca işlev, dbms_output deyimlerini de üretebilir, böylece her zaman hata ayıklama için kullanılabilirler, ancak bu biraz fazladan ekler.

Düzenleme

Hmmm, değil paketin dışında kendi türünü (ve o türdeki bir tablo) beyan etmek istekli olmadıkça o cast() için kullanılabilir bir tip döndü refcursor mümkün olduğundan emin. Sadece sonuçları dökümü olsa bunu yapabilirsiniz:

create package mypackage as 
    function getquestions(user in varchar2) return sys_refcursor; 
end mypackage; 
/

create package body mypackage as 
    function getquestions(user in varchar2) return sys_refcursor as 
     r sys_refcursor; 
    begin 
     open r for 
      /* Whatever your real query is */ 
      select 'Row 1' col1, 'Value 1' col2 from dual 
      union 
      select 'Row 2', 'Value 2' from dual 
      union 
      select 'Row 3', 'Value 3' from dual; 
      return r; 
    end; 
end mypackage; 
/

var r refcursor; 
exec :r := mypackage.getquestions('OMG Ponies'); 
print r; 

Ve başka prosedür ya işlevinde çağrısının sonucu kullanabilirsiniz; Sadece PL/SQL dışında biraz zor gibi görünüyor. o aslında aynı şeyi yapabilir bir prosedür olup olmadığını Bu yaklaşımla,: eklemek Düzenlendi

var r refcursor; 
exec mypackage.getquestions(:r, 'OMG Ponies'); 
print r; 
+0

SQL Server sürümü muhtemelen bir işlev değildir. SQL Server'da, sonuçlara benzer şekilde döndürülen saklı yordamlar, yalnızca imlecin bağlı olmayan ifadelerini kullanır. Böyle bir saklı yordamın yürütülmesinin sonuçlarının alınması, istemci tarafında bir 'select' sorgusundan sonuçların alınmasıyla aynıdır. –

+0

Bir gün SQL Server hakkında bilgi almalıyım. Eşdeğeri gibi bir OUTC parametresi ile bir prosedür yerine, bir refcursor döndüren bir işlev olur gibi görünüyor, bu yüzden plan SQL bir sorguda kullanılabilir? –

+0

MyPackage.GetQuestions bir yordamdır. Örneğin. PROSEDÜR GETQUESIONS (OUT MYPACKAGE.refcur_question, IN IN VARCHAR2). Tekniğinizi bağladığımda geçersiz tanımlayıcı hataları alıyorum –

0
/* 
    Create Sample Package in HR Schema 
*/ 

CREATE OR REPLACE PACKAGE PRINT_REF_CURSOR 
AS 
    PROCEDURE SP_S_EMPLOYEES_BY_DEPT (
     p_DEPARTMENT_ID IN INTEGER, 
     Out_Cur OUT SYS_REFCURSOR); 

END PRINT_REF_CURSOR;   

CREATE OR REPLACE PACKAGE BODY PRINT_REF_CURSOR 
AS 

    PROCEDURE SP_S_EMPLOYEES_BY_DEPT (
     p_DEPARTMENT_ID IN INTEGER, 
     Out_Cur OUT SYS_REFCURSOR) 
    AS 
    BEGIN 
     OPEN Out_Cur FOR 
      SELECT * 
      FROM EMPLOYEES 
      WHERE DEPARTMENT_ID = p_DEPARTMENT_ID; 
    EXCEPTION 
     WHEN NO_DATA_FOUND 
     THEN 
     DBMS_OUTPUT.Put_Line('SP_S_EMPLOYEES_BY_DEPT' || ',' || '-20000' || ','); 
     WHEN OTHERS 
     THEN 
     DBMS_OUTPUT.Put_Line('SP_S_EMPLOYEES_BY_DEPT' || ',' || '-20001' || ',');  
    END SP_S_EMPLOYEES_BY_DEPT;   

END PRINT_REF_CURSOR;  

/* 
    Fetch values using Ref Cursor and display it in grid. 
*/ 

var RC refcursor; 

DECLARE 
    p_DEPARTMENT_ID NUMBER; 
    OUT_CUR SYS_REFCURSOR; 

BEGIN 
    p_DEPARTMENT_ID := 90; 
    OUT_CUR := NULL; 

    PRINT_REF_CURSOR.SP_S_EMPLOYEES_BY_DEPT (p_DEPARTMENT_ID, OUT_CUR); 
    :RC := OUT_CUR; 

END; 
/
PRINT RC; 
/************************************************************************/ 
1

SQL Geliştirici otomatik saklı yordamları çalıştıran çıktı yakalar.Bizim SQL çalışma sayfasında bir anon bloğunun bir parçası olarak refcursor çalıştırmak istiyorsanız bizim prosedür editörü doğrudan saklı yordam Koşu, sen, Şimdi burada

SQL Developer Tip: Viewing REFCURSOR Output

benim sonrası detaylı bu davranışı görebilirsiniz Bu

var rc refcursor 
exec :rc := GET_EMPS(30) 
print rc 

-dir; burada GET_EMPS benzer bir şey yapabileceğini() sizin sp_GetQuestions ('OMG midilli') çağrısı olurdu. BASKI komutu saklı yordam aracılığıyla koştum 'sorgusu' çıktı gönderir ve şöyle görünür: Şimdi

anonymous block completed 
RC 
----------------------------------------------------------------------------------------------------- 
EMPLOYEE_ID FIRST_NAME   LAST_NAME     EMAIL      PHONE_NUMBER   HIRE_DATE     JOB_ID  SALARY  COMMISSION_PCT MANAGER_ID DEPARTMENT_ID 
----------- -------------------- ------------------------- ------------------------- -------------------- ------------------------- ---------- ---------- -------------- ---------- ------------- 
114   Den     Raphaely     DRAPHEAL     515.127.4561   07-DEC-94 12.00.00  PU_MAN  11000      100  30    
115   Alexander   Khoo      AKHOO      515.127.4562   18-MAY-95 12.00.00  PU_CLERK 3100      114  30    
116   Shelli    Baida      SBAIDA     515.127.4563   24-DEC-97 12.00.00  PU_CLERK 2900      114  30    
117   Sigal    Tobias     STOBIAS     515.127.4564   24-JUL-97 12.00.00  PU_CLERK 2800      114  30    
118   Guy     Himuro     GHIMURO     515.127.4565   15-NOV-98 12.00.00  PU_CLERK 2600      114  30    
119   Karen    Colmenares    KCOLMENA     515.127.4566   10-AUG-99 12.00.00  PU_CLERK 2500      114  30    

, sen 10g söyledi. 12c'deyseniz, örtülü imleç sonuçlarını desteklemek için PL/SQL motorunu geliştirdik. Yani bu biraz daha kolaylaşıyor, daha fazla imleci ayarlamayacaksınız, sadece burada belgelenen verileri almak için bir çağrı yapın: http://docs.oracle.com/database/121/DRDAA/migr_tools_feat.htm#DRDAA230

+0

Aslında bu özelliğe dün bakmıştım. İyi ama bir "Çalıştır PL/SQL" penceresini açamayacağımı anlamak için bir PIA türü var 12c bahşiş için teşekkürler. Hala 11G'deyiz, bu yüzden en sonunda onu kullanmayı sabırsızlıkla bekliyorum. Ayrıca postanızın biçimlendirmesini de düzelttim. Nasıl yaptığımla ilgili bilgi için [Editing-help] (http://stackoverflow.com/editing-help) adresine bakın. –

+0

Bu yüzden Prosedür Düzenleyicimiz gibi çıktıyı otomatik olarak yakalayabilen bir 'run PL/SQL' penceresi istiyoruz tek bir ünite yürütürken sunar? Kötü bir fikir değil ... Grubun etrafında tekmeleyeceğim ve nereye gittiğini göreceğim. – thatjeffsmith

İlgili konular