2010-08-19 14 views
15

एमएस एसक्यूएल सर्वर में यदि मैं एक संग्रहीत प्रक्रिया से परिणामों की जांच करना चाहता हूं तो मैं प्रबंधन स्टूडियो में निम्नलिखित निष्पादित कर सकता हूं।आप ओरेकल प्रक्रिया से अच्छी तरह से स्वरूपित परिणाम कैसे प्राप्त करते हैं जो एक संदर्भ कर्सर देता है?

--SQL SERVER WAY 
exec sp_GetQuestions('OMG Ponies') 

परिणाम फलक में आउटपुट इस तरह दिख सकता है।

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) 

लूप या प्रिंट स्टेटमेंट लिखने की कोई आवश्यकता नहीं है।

एक ही बात Oracle में मैं जैसे

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 

तो SQL संस्करण 1 लाइन है और ओरेकल 18 है SQL डेवलपर में निम्नलिखित गुमनाम ब्लॉक पर अमल हो सकता है

--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; 

यह outputs ऐसा करने के लिए और आउटपुट बदसूरत है। यदि बहुत सारे कॉलम हैं और/या डेटा संख्यात्मक है तो इसका विस्तार हुआ है।

क्या इस बारे में मेरे लिए अजीब है कि अगर मैं या तो SQL डेवलपर या प्रबंधन स्टूडियो में इस बयान ...

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

लिखने परिणाम काफी समान हैं। इससे मुझे ऐसा लगता है कि मैं या तो एक तकनीक खो रहा हूं या गलत उपकरण का उपयोग कर रहा हूं।

उत्तर

16

तो GetQuestions एक refcursor है, जो कि तुम क्या एसक्यूएल सर्वर संस्करण में है प्रतीत हो रहा है फ़ंक्शन है, तो बजाय आप कुछ इस तरह करने में सक्षम हो सकता है:

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

या आप यह आवश्यकता है एक पीएल/एसक्यूएल ब्लॉक में आप कर्सर में एक ही चयन का उपयोग कर सकते हैं।

आप फ़ंक्शन भी dbms_output कथन का उत्पादन कर सकते हैं ताकि वे हमेशा डिबगिंग के लिए उपलब्ध हों, हालांकि यह थोड़ा ओवरहेड जोड़ता है।

संपादित

हममम, यकीन है कि यह एक प्रयोग करने योग्य प्रकार के लिए लौट आए refcursor cast() संभव है जब तक आप पैकेज के बाहर अपने खुद के प्रकार (और उस प्रकार के टेबल) की घोषणा करने को तैयार हैं नहीं। आप इस हालांकि अभी परिणाम डंप करने के लिए कर सकते हैं,:

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; 

और तुम एक और प्रक्रिया या समारोह में कॉल का परिणाम का उपयोग कर सकते हैं; यह सिर्फ पीएल/एसक्यूएल के बाहर हो रहा है जो थोड़ा मुश्किल लगता है।

जोड़ने के लिए संपादित: इस दृष्टिकोण के साथ, अगर यह एक प्रक्रिया आप अनिवार्य रूप से एक ही बात कर सकते हैं:

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

SQL सर्वर संस्करण शायद कोई फ़ंक्शन नहीं है। SQL सर्वर में, संग्रहित प्रक्रियाएं जो परिणामों की तरह सेट की गई हैं, केवल 'चयन' कथन हैं जो कर्सर से बंधे नहीं हैं। ऐसी संग्रहीत प्रक्रिया के निष्पादन के परिणाम प्राप्त करना क्लाइंट पक्ष पर 'चयन' क्वेरी से परिणाम प्राप्त करने जैसा ही है। –

+0

मुझे एक दिन SQL सर्वर के बारे में जानना चाहिए। ऐसा लगता है कि समकक्ष एक ऐसा फ़ंक्शन होगा जो एक 'आउटपुट पैरामीटर' की प्रक्रिया के बजाए एक रिफर्सर ​​देता है, इसलिए इसका उपयोग एसक्यूएल एसक्यूएल से एक क्वेरी में किया जा सकता है? –

+0

MyPackage.GetQuestions एक प्रक्रिया है। जैसे प्रक्रिया GETQUETSIONS (आउटपुट में MyPACKAGE.refcur_question, उपयोगकर्ता VARCHAR2 में)। जब मैंने आपकी तकनीक को बांध लिया तो मुझे अमान्य पहचानकर्ता त्रुटियां मिलीं –

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 डेवलपर स्वचालित रूप से उत्पादन अपने संग्रहित प्रक्रियाओं चलने से फैल जाती है।हमारी प्रक्रिया सीधे संपादक से संग्रहीत प्रक्रिया चल रहा है, आप मेरी पोस्ट यहाँ

SQL Developer Tip: Viewing REFCURSOR Output

में इस व्यवहार को विस्तृत देख सकते हैं अब, अगर आप हमारे एसक्यूएल वर्कशीट में एक anon ब्लॉक के हिस्से के रूप refcursor चलाना चाहते हैं, तो आप इस

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

--where GET_EMPS के लिए इसी तरह कुछ कर सकते हैं() अपने sp_GetQuestions ('OMG टट्टू') कॉल किया जाएगा। प्रिंट कमांड 'जिज्ञासा' जो संग्रहीत प्रक्रिया के माध्यम से भाग गया है से उत्पादन भेजता है, और इस तरह दिखता है:

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    

अब, आप 10g कहा। यदि आप 12 सी में हैं, तो हमने निहित कर्सर परिणामों का समर्थन करने के लिए पीएल/एसक्यूएल इंजन बढ़ाया है। इसलिए यह थोड़ा आसान हो जाता है, कर्सर को और सेट नहीं करते हैं, आप डेटा प्राप्त करने के लिए बस कॉल करते हैं, जैसा कि यहां दस्तावेज किया गया है: http://docs.oracle.com/database/121/DRDAA/migr_tools_feat.htm#DRDAA230

+0

मैं वास्तव में कल इस सुविधा को देख रहा था। यह अच्छा है लेकिन इसमें शामिल होने के लिए पीआईए की तरह मैं 12 सी टिप के लिए धन्यवाद "रन पीएल/एसक्यूएल" विंडो नहीं खोल सकता। हम अभी भी 11 जी पर हैं इसलिए मैं इसे अंततः उपयोग करने के लिए तत्पर हूं। इसके अलावा मैंने आपकी पोस्ट का स्वरूपण तय किया। यह देखने के लिए [संपादन-सहायता] (http://stackoverflow.com/editing-help) देखें कि मैंने इसे कैसे किया –

+0

तो आप एक 'रन पीएल/एसक्यूएल' विंडो चाहते हैं जो आउटपुट को ऑटो-हड़पने वाला होगा, जैसे कि हमारे प्रक्रिया संपादक एक इकाई को निष्पादित करते समय ऑफ़र करता है? बुरा विचार नहीं है ... मैं इसे समूह के चारों ओर लात दूंगा और देख सकता हूं कि यह कहां जाता है। – thatjeffsmith