2010-02-16 11 views
11

में सम्मिलित पंक्तियों को लौटाना मैं वर्तमान में एक रिपोर्ट पीढ़ी सर्वलेट पर काम कर रहा हूं जो कई तालिकाओं से जानकारी एकत्र करता है और एक रिपोर्ट उत्पन्न करता है। परिणामी पंक्तियों को वापस करने के अलावा, मैं उन्हें एक रिपोर्ट टेबल में भी संग्रहीत कर रहा हूं, इसलिए उन्हें बाद में पुन: उत्पन्न करने की आवश्यकता नहीं होगी, और अगर वे जिन टेबलों से खींचे जाते हैं, वे मिटाए जाएंगे। बाद मैं फार्म के एक बयान है ऐसा करने के लिए (एनबी: एक्स बाह्य उत्पन्न होता है और वास्तव में इस बयान में एक निरंतर):PostgreSQL

INSERT INTO reports 
    (report_id, col_a, col_b, col_c) 
SELECT x as report_id, foo.a, bar.b, bar.c 
FROM foo, bar 

यह ठीक काम करता है, लेकिन फिर मैं एक दूसरे क्वेरी की जरूरत है वास्तव में जिसके परिणामस्वरूप वापस जाने के लिए पंक्तियों, उदाहरण के लिए

SELECT col_a, col_b, col_c 
FROM reports 
WHERE report_id = x 

यह ठीक काम करता है और बाद से यह केवल एकल तालिका शामिल है, महंगा नहीं होना चाहिए, लेकिन लगता है जैसे मैं सीधे प्रविष्टि दूसरा क्वेरी से बचने का परिणाम लौटाने के लिए सक्षम होना चाहिए। क्या ऐसा करने के लिए कुछ वाक्यविन्यास है जो मैं नहीं ढूंढ पा रहा हूं? (मुझे ध्यान रखना चाहिए, मैं डीबी काम में काफी नया हूं, इसलिए यदि सही उत्तर केवल दूसरी क्वेरी को चलाने के लिए है, तो यह थोड़ा धीमा है, इसलिए यह हो)

उत्तर

20

पोस्टग्रेएसक्यूएल में संस्करण> = 8.2 के साथ इस निर्माण का उपयोग कर सकते हैं:

INSERT INTO reports (report_id, col_a, col_b, col_c) 
SELECT x as report_id, foo.a, bar.b, bar.c 
FROM foo, bar 
RETURNING col_a, col_b, col_c 
+0

हम 8.4 चला रहे हैं ताकि धन्यवाद एकदम सही है,। – Dusty

+0

+1 एक ठोस उत्तर के लिए और (भी) संस्करण आवश्यकताओं का जिक्र करते हैं (हालांकि अधिकांश लोगों को अब तक कम से कम 8.3 पर होना चाहिए) – ChristopheD

4

आप एक एसआरएफ का भी उपयोग कर सकते हैं हालांकि यह अधिक हो सकता है। यह इस बात पर निर्भर करता है कि आप क्या करने की कोशिश कर रहे हैं। उदाहरण के लिए, यदि आप केवल तर्क का एक टुकड़ा करने के लिए जानकारी लौट रहे हैं जो अधिक क्वेरी करने के लिए सीधे डेटाबेस पर वापस जायेगा, तो यह एक एसआरएफ का उपयोग करने के लिए समझ में आ सकता है।

http://wiki.postgresql.org/wiki/Return_more_than_one_row_of_data_from_PL/pgSQL_functions

3

या चयन के बिना:

INSERT INTO distributors (did, dname) VALUES (DEFAULT, 'XYZ Widgets') 
    RETURNING did; 

documentation

+1

मेरा मानना ​​है कि ओप ने पूरी पंक्ति वापस करने के लिए कहा था, जो 'वापसी * ​​होगा;' – BishopZ