9

यह कई बार here और here से पूछा गया है, लेकिन मेरे किसी भी उत्तर में मेरे उत्तर में उपयुक्त नहीं है क्योंकि मैं अपने अद्यतन विवरण को पीएल/पीजीएसक्यूएल फ़ंक्शन में उपयोग नहीं करना चाहता हूं और उपयोग नहीं करना चाहता GET DIAGNOSTICS integer_var = ROW_COUNTरॉ में अद्यतन विवरण द्वारा प्रभावित पंक्तियां plpgsql

मुझे इसे कच्चे एसक्यूएल में करना है।

उदाहरण के लिए, एमएस एसक्यूएल सर्वर में हम @@ ROWCOUNT जो की तरह इस्तेमाल किया जा सकता है निम्नलिखित:

UPDATE <target_table> 
SET Proprerty0 = Value0 
WHERE <predicate>; 
SELECT <computed_value_columns> 
FROM <target> 
WHERE @@ROWCOUNT > 0; 

डेटाबेस मैं जानता हूँ कि अगर अद्यतन सफल था और परिकलित मानों वापस पाने के लिए एक गोल यात्रा में ।

'@@ ROWCOUNT' के बजाय क्या उपयोग किया जा सकता है? क्या कोई इस बात की पुष्टि कर सकता है कि वास्तव में यह वास्तव में असंभव है?

अग्रिम धन्यवाद।

संपादित करें 1: मैं पुष्टि करता हूं कि मुझे कच्चे एसक्यूएल का उपयोग करने की आवश्यकता है (मैंने मूल विवरण में "कच्चे plpgsql" लिखा है)।

मेरे सवाल का स्पष्ट विचार है कि अद्यतन बयान केवल एक पंक्ति को प्रभावित करता है और आशावादी संगामिति के बारे में सोचना कृपया सुनिश्चित करने की कोशिश में:

  1. ग्राहक पहली बार में एक SELECT वक्तव्य था।

  2. वह अद्यतन बनाता है और जानता है कि कौन से डेटाबेस गणना कॉलम को चयन खंड में शामिल किया जाना है। अन्य चीजों के अलावा, भविष्यवाणी में एक टाइमस्टैम्प शामिल होता है जिसे पंक्तियों को अद्यतन होने पर हर बार गणना की जाती है।

  3. तो, यदि हमारे पास 1 पंक्ति लौटा है तो सब कुछ ठीक है। यदि कोई पंक्ति वापस नहीं आती है तो हम जानते हैं कि पिछले अपडेट था और क्लाइंट को फिर से क्लोज़ अपडेट करने का प्रयास करने से पहले डेटा रीफ्रेश करने की आवश्यकता हो सकती है। यही कारण है कि हमें गणना करने की आवश्यकता है कि गणना कॉलम लौटने से पहले अद्यतन कथन से कितनी पंक्तियां प्रभावित हुईं। यदि अपडेट विफल रहता है तो कोई पंक्ति वापस नहीं की जानी चाहिए।

+1

कृपया प्रश्नों में हमेशा अपने PostgreSQL संस्करण का उल्लेख करें। –

+3

तो आप ** पीएल/पीजीएसक्यूएल में नहीं करना चाहते हैं लेकिन एसक्यूएल में करना चाहते हैं। अन्यथा आप * प्राप्त कर सकते हैं 'ग्रेट डायग्नोस्टिक' –

+0

@ क्रिएगिंगर: संबंधित टैग देखें। –

उत्तर

10

तुम क्या चाहते नहीं वर्तमान में फार्म का है कि आप का वर्णन में संभव है, लेकिन मुझे लगता है कि तुम क्या आप UPDATE ... RETURNING साथ चाहते हैं कर सकते हैं। UPDATE ... RETURNING in the manual देखें।

UPDATE <target_table> 
SET Proprerty0 = Value0 
WHERE <predicate> 
RETURNING Property0; 

यह सुनिश्चित करना मुश्किल है, क्योंकि आपके द्वारा प्रदान किया गया उदाहरण कुछ हद तक बेकार है।

तुम भी एक wCTE है, जो अधिक जटिल मामलों की अनुमति देता है का उपयोग कर सकते हैं:

WITH updated_rows AS (
    UPDATE <target_table> 
    SET Proprerty0 = Value0 
    WHERE <predicate> 
    RETURNING row_id, Property0 
) 
SELECT row_id, some_computed_value_from_property 
FROM updated_rows; 

common table expressions (WITH queries) और depesz's article on wCTEs देखें।

CREATE TABLE upret_demo(
    id serial primary key, 
    somecol text not null, 
    last_updated timestamptz 
); 

INSERT INTO upret_demo (somecol, last_updated) VALUES ('blah',current_timestamp); 

UPDATE upret_demo 
SET 
    somecol = 'newvalue', 
    last_updated = current_timestamp 
WHERE last_updated = '2012-12-03 19:36:15.045159+08' -- Change to your timestamp 
RETURNING 
    somecol || '_computed' AS a, 
    'totally_new_computed_column' AS b; 

आउटपुट जब 1 समय चलाएँ::


अद्यतन सवाल में कुछ जोड़ा विस्तार के आधार पर, यहाँ एक डेमो UPDATE ... RETURNING का उपयोग कर

  a   |    b    
-------------------+----------------------------- 
newvalue_computed | totally_new_computed_column 
(1 row) 

जब फिर से चलाने के लिए, इसका कोई प्रभाव नहीं होगा और कोई पंक्ति नहीं लौटाएगी।

यदि आपके पास परिणाम सेट में अधिक जटिल गणनाएं हैं, तो आप एक डब्लूसीटीई का उपयोग कर सकते हैं ताकि आप अपडेट के परिणामों पर जुड़ सकें और अन्य जटिल चीजें कर सकें।

WITH upd_row AS (
    UPDATE upret_demo SET 
    somecol = 'newvalue', 
    last_updated = current_timestamp 
    WHERE last_updated = '2012-12-03 19:36:15.045159+08' 
    RETURNING id, somecol, last_updated 
) 
SELECT 
    'row_'||id||'_'||somecol||', updated '||last_updated AS calc1, 
repeat('x',4) AS calc2 
FROM upd_row; 

दूसरे शब्दों में: उपयोग UPDATE ... RETURNING, या तो सीधे गणना की पंक्तियों का उत्पादन, या अधिक जटिल मामलों के लिए एक लिखने योग्य CTE में करने के लिए।

+0

लिखने योग्य सीटीई संस्करण 9.2 के रूप में काम करता है। लिखने योग्य सीटीई महान हैं! मुझे समझ में नहीं आता कि उन्हें लागू होने से पहले इतना समय क्यों लगा और अधिकांश डीबीएमएस ब्रांड अभी भी इसका समर्थन नहीं करते हैं, मैं अब इसके बिना काम नहीं कर सकता। –

+0

धन्यवाद! अद्यतन ... वापसी के रूप में काम कर रहा है। –

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