Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

एक सेलेक्ट स्टेटमेंट के परिणाम अपडेट करें

मैंने इसके लिए औपचारिक नाम नहीं देखा है। Oracle SQL Reference बस एक सबक्वायरी को अपडेट करने के लिए संदर्भित करता है। मैं इसे "व्यू अपडेटिंग" के रूप में देखता हूं, जिसमें सबक्वायरी इन-लाइन व्यू में है।

हां, यह तब काम करता है जब कई तालिकाओं को जोड़ा जाता है, लेकिन अद्यतन करने के नियमों के अधीन। इसका मतलब है कि केवल एक दृश्य की आधार तालिका को अद्यतन किया जा सकता है, और यह तालिका दृश्य में "कुंजी-संरक्षित" होनी चाहिए:अर्थात इसकी पंक्तियाँ केवल एक बार दृश्य में दिखाई देने में सक्षम होनी चाहिए। इसके लिए यह आवश्यक है कि दृश्य (सबक्वेरी) में किसी भी अन्य तालिका को अद्यतन करने के लिए तालिका पर विदेशी कुंजी बाधाओं के माध्यम से संदर्भित किया जाए।

कुछ उदाहरण मदद कर सकते हैं। मानक Oracle EMP और DEPT तालिकाओं का उपयोग करते हुए, EMP.EMPNO को EMP की प्राथमिक कुंजी के रूप में परिभाषित किया जा रहा है, और EMP.DEPTNO को DEPT.DEPTNO के लिए एक विदेशी कुंजी के रूप में परिभाषित किया जा रहा है, तब इस अद्यतन की अनुमति है:

update (select emp.empno, emp.ename, emp.sal, dept.dname
        from   emp join dept on dept.deptno = emp.deptno
       )
set sal = sal+100;

लेकिन यह नहीं है:

-- DEPT is not "key-preserved" - same DEPT row may appear
-- several times in view
update (select emp.ename, emp.sal, dept.deptno, dept.dname
        from   emp join dept on dept.deptno = emp.deptno
       )
set dname = upper(dname);

प्रदर्शन के लिए:ऑप्टिमाइज़र पार्सिंग के दौरान अद्यतन की जाने वाली आधार तालिका की पहचान करेगा (चाहिए), और अन्य तालिका में शामिल होने पर ध्यान नहीं दिया जाएगा क्योंकि उनका प्रदर्शन किए जाने वाले अद्यतन पर कोई असर नहीं पड़ता है - जैसा कि यह ऑटोट्रेस आउटपुट दिखाता है:

SQL> update (select emp.ename, emp.sal, dept.dname
  2              from   emp join dept on dept.deptno = emp.deptno
  3             )
  4      set sal = sal-1;

33 rows updated.


Execution Plan
----------------------------------------------------------
Plan hash value: 1507993178

------------------------------------------------------------------------------------
| Id  | Operation           | Name         | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------
|   0 | UPDATE STATEMENT    |              |    33 |   495 |     3   (0)| 00:00:01 |
|   1 |  UPDATE             | EMP          |       |       |            |          |
|   2 |   NESTED LOOPS      |              |    33 |   495 |     3   (0)| 00:00:01 |
|   3 |    TABLE ACCESS FULL| EMP          |    33 |   396 |     3   (0)| 00:00:01 |
|*  4 |    INDEX UNIQUE SCAN| SYS_C0010666 |     1 |     3 |     0   (0)| 00:00:01 |
------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   4 - access("EMP"."DEPTNO"="DEPT"."DEPTNO")

(ध्यान दें कि DEPT.DNAME सबक्वेरी में दिखाई देने के बावजूद तालिका DEPT तक कभी नहीं पहुँचा जाता है)।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. क्या Oracle pl sql का उपयोग करके http अनुरोध के लिए utl_http पैकेज का कोई विकल्प है?

  2. मैं Oracle में sys के स्वामित्व वाली तालिकाएँ कैसे बनाऊँ?

  3. एकाधिक पंक्तियों को प्राप्त करें और 1 चर में स्टोर करें - ओरेकल संग्रहीत प्रक्रिया

  4. Oracle 11g में TIMESTAMPDIFF?

  5. वापसी की तारीख को कोई घंटा और मिनट वापस नहीं मिला