2009-07-02 9 views
13

एसक्यूएल सर्वर में, आप इस तरह कर सकते हैं:क्या SQL सर्वर के आउटपुट के बराबर एक ओरेकल है। *?

INSERT INTO some_table (...) OUTPUT INSERTED.* 
VALUES (...) 

ताकि तुम कॉलम/मूल्यों के मनमाने ढंग से सेट डालने और उन परिणामों वापस मिल सकता है। ओरेकल में ऐसा करने का कोई तरीका है?

सबसे अच्छा मैं के साथ आ सकते हैं

यह है:

INSERT INTO some_table (...) 
VALUES (...) 
RETURNING ROWID INTO :out_rowid 

... का उपयोग कर: एक बाँध चर के रूप में out_rowid। और फिर इस तरह एक दूसरे क्वेरी का उपयोग:

SELECT * 
FROM some_table 
WHERE ROWID = :rowid 

... लेकिन यह काफी एक ही रूप में यह कॉलम के अंदर सब कुछ, बस कॉलम नहीं मैं डाला रिटर्न नहीं है।

क्या पीएल/एसक्यूएल का उपयोग किए बिना ऐसा करने का कोई बेहतर तरीका है और अधिमानतः केवल एक प्रश्न के साथ?

+1

यदि यह कॉलम आप रुचि रखते हैं (पंक्ति डेटा नहीं) ... - आप कैसे (...) प्राप्त कर रहे हैं? निश्चित रूप से उस बिंदु पर आप जानते हैं कि सम्मिलन में कौन से कॉलम का संदर्भ दिया जा रहा है? –

+0

मैं बस आउटपुट (http://msdn.microsoft.com/en-us/library/ms177564.aspx) पर पढ़ता हूं। स्पष्ट रूप से यह आपको यह चुनने की अनुमति देता है कि पंक्ति डेटा लौटाया गया है कि किसी भी तालिका ट्रिगर चलाने से पहले या उसके बाद। ओरेकल का रिटर्निंग क्लॉज इसका समर्थन नहीं करता है - ट्रिगर्स को इसे बदलने का मौका मिलने के बाद ही यह आपको डेटा देता है। –

+0

@ जेफरी केम्प - मुझे पता होगा कि वे कॉलम क्या हैं। हालांकि, डेटाबेस होना चाहिए। :-) –

उत्तर

3

RETURNING खंड BULK COLLECT INTO synthax का समर्थन करता है। पर विचार करें (10g):

SQL> DECLARE 
    2  TYPE tab_rowid IS TABLE OF ROWID; 
    3  l_r tab_rowid; 
    4 BEGIN 
    5  INSERT INTO t (SELECT ROWNUM FROM dual CONNECT BY LEVEL <= 5) 
    6  RETURNING ROWID BULK COLLECT INTO l_r; 
    7  FOR i IN 1 .. l_r.count LOOP 
    8  dbms_output.put_line(l_r(i)); 
    9  END LOOP; 
10 END; 
11/

ORA-06550: line 7, column 5: 
PL/SQL: ORA-00933: SQL command not properly ended 

हो सकता है कि आप एक अधिक है:

SQL> CREATE TABLE t (ID NUMBER); 

Table created 
SQL> INSERT INTO t (SELECT ROWNUM FROM dual CONNECT BY LEVEL <= 5); 

5 rows inserted 
SQL> DECLARE 
    2  TYPE tab_rowid IS TABLE OF ROWID; 
    3  l_r tab_rowid; 
    4 BEGIN 
    5  UPDATE t SET ID = ID * 2 
    6  RETURNING ROWID BULK COLLECT INTO l_r; 
    7  FOR i IN 1 .. l_r.count LOOP 
    8  dbms_output.put_line(l_r(i)); 
    9  END LOOP; 
10 END; 
11/

AADcriAALAAAAdgAAA 
AADcriAALAAAAdgAAB 
AADcriAALAAAAdgAAC 
AADcriAALAAAAdgAAD 
AADcriAALAAAAdgAAE 

यह बहु पंक्ति UPDATE और DELETE मेरी संस्करण (10.2.0.3.0), लेकिन साथ नहींINSERT साथ साथ काम करता है हालिया संस्करण (11 जी?) और BULK COLLECT INTO बहु-पंक्ति INSERT एस के लिए समर्थित है?

+0

मैं पंक्तियों की संख्या के बारे में बहुत चिंतित नहीं हूं क्योंकि मैं कॉलम की संख्या हूं। कॉलम चरम होने पर पंक्तियों की संख्या हमेशा एक होगी। –

+0

@ जेसन: मुझे लगता है कि आपको dbms_sql का उपयोग करना होगा यदि कॉलम की संख्या परिवर्तनीय है/संकलित समय पर ज्ञात नहीं है –

5

शायद मुझे सवाल नहीं समझा, लेकिन क्या ऐसा नहीं होगा? (आपको पता होना चाहिए कि तुम क्या वापस चाहते हैं)

INSERT INTO some_table (...) 
VALUES (...) 
RETURNING some_column_a, some_column_b, some_column_c, ... INTO :out_a, :out_b, :out_c, ... 

@Vincent लौटने थोक बहु पंक्ति सम्मिलित करने के लिए में इकट्ठा केवल संयोजन के रूप में संग्रह से एक और शब्द में (forall के साथ काम करता है, तो आप सम्मिलित आप दूसरे में "परिणाम" प्राप्त कर सकते हैं)

संबंधित मुद्दे