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

हम डायनामिक एसक्यूएल स्टेटमेंट के साथ मजबूत रेफ कर्सर का उपयोग क्यों नहीं कर सकते?

यहाँ एक दृढ़ता से टाइप किए गए रेफरी कर्सर के साथ एक प्रक्रिया है:

SQL> create or replace procedure p1 is
  2      type dept_rc is ref cursor return dept%rowtype;
  3      my_ref_cursor dept_rc;
  4  begin
  5      open my_ref_cursor for
  6          select * from dept;
  7  end;
  8  /

Procedure created.

SQL>

यह अगला कथन विफल हो जाता है क्योंकि EMP रिकॉर्ड के हस्ताक्षर DEPT तालिका से मेल नहीं खाते।

SQL> create or replace procedure p1 is
  2      type dept_rc is ref cursor return dept%rowtype;
  3      my_ref_cursor dept_rc;
  4  begin
  5      open my_ref_cursor for
  6          select * from emp;
  7  end;
  8  /

Warning: Procedure created with compilation errors.

SQL> show error
Errors for PROCEDURE P1:

LINE/COL ERROR
-------- -----------------------------------------------------------------
5/5      PL/SQL: SQL Statement ignored
6/9      PLS-00382: expression is of wrong type

SQL>

लेकिन अगर हम डीईपीटी तालिका से मिलान करने के लिए प्रक्षेपण बदलते हैं तो हमें फिर से सफलता मिलती है:

SQL> create or replace procedure p1 is
  2      type dept_rc is ref cursor return dept%rowtype;
  3      my_ref_cursor dept_rc;
  4  begin
  5      open my_ref_cursor for
  6          select deptno, ename, job from emp;
  7  end;
  8  /

Procedure created.

SQL>

तो, हम गतिशील एसक्यूएल के साथ दृढ़ता से टाइप किए गए रेफ-कर्सर का उपयोग क्यों नहीं कर सकते?

SQL> create or replace procedure p1 is
  2      type dept_rc is ref cursor return dept%rowtype;
  3      my_ref_cursor dept_rc;
  4  begin
  5      open my_ref_cursor for
  6          'select * from dept';
  7  end;
  8  /

Warning: Procedure created with compilation errors.

SQL> show error
Errors for PROCEDURE P1:

LINE/COL ERROR
-------- -----------------------------------------------------------------
5/5      PL/SQL: Statement ignored
5/10     PLS-00455: cursor 'MY_REF_CURSOR' cannot be used in dynamic SQL
         OPEN statement

SQL>

क्योंकि कंपाइलर डायनेमिक SQL स्टेटमेंट में स्ट्रिंग को पार्स नहीं कर सकता है। इसलिए यह दावा नहीं कर सकता कि क्वेरी के प्रोजेक्शन में कॉलम संख्या में मेल खाते हैं और रेफ कर्सर के हस्ताक्षर को डेटाटाइप करते हैं। नतीजतन यह रेफरी कर्सर चर और क्वेरी के बीच अनुबंध को मान्य नहीं कर सकता है। यह समझना और भी आसान है कि इसकी अनुमति क्यों नहीं दी जा सकती जब हम मानते हैं कि USER_TAB_COLUMNS पर एक क्वेरी से डायनेमिक SQL स्टेटमेंट को इकट्ठा किया जा सकता है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. TransactionScope और Oracle के साथ समस्याएं

  2. मैनुअल डीबी अपग्रेड के बाद ग्रिड नियंत्रण का उन्नयन

  3. सी # से आउट-पैरामीटर के रूप में रेफ कर्सर के साथ ओरेकल फ़ंक्शन को कैसे कॉल करें?

  4. Oracle के लिए JDBC में क्लाइंट जानकारी सेट करना

  5. ऐरे प्रतिक्रिया से Oracle 12c PLSQL SOAP EXTRACTVALUE