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

पीएल/एसक्यूएल में शून्य सहयोगी सरणी के लिए यह जांच क्यों विफल हो रही है?

मुझे लगता है कि इसका परिणाम "नल सहयोगी सरणी" मुद्रित होना चाहिए। सहयोगी सरणियों के लिए यह धारणा गलत है। घोषित होने पर वे मौजूद होते हैं, लेकिन खाली होते हैं। यह अन्य प्रकार के PL/SQL संग्रहों के लिए सही होगा:

तुलना करें:

SQL> declare
  2      type varchar2_100_aa is table of varchar2(100) index by binary_integer;
  3      test varchar2_100_aa;
  4  begin
  5      test(1) := 'Hello';
  6      dbms_output.put_line(test(1));
  7  end;
  8  /
Hello

PL/SQL procedure successfully completed.

SQL> declare
  2      type varchar2_100_va is varray(100) of varchar2(100);
  3      test varchar2_100_va;
  4  begin
  5      test(1) := 'Hello';
  6      dbms_output.put_line(test(1));
  7  end;
  8  /
declare
*
ERROR at line 1:
ORA-06531: Reference to uninitialized collection
ORA-06512: at line 5

परिवर्तनीय सरणी सही ढंग से की गई:

SQL> declare
  2      type varchar2_100_va is varray(10) of varchar2(100);
  3      test varchar2_100_va;
  4  begin
  5      test := varchar2_100_va(); -- not needed on associative array
  6      test.extend; -- not needed on associative array
  7      test(1) := 'Hello';
  8      dbms_output.put_line(test(1));
  9  end;
 10  /
Hello

PL/SQL procedure successfully completed.

क्योंकि सहयोगी सरणी खाली है first और last शून्य हैं, यही कारण है कि आपका दूसरा उदाहरण ORA-06502: PL/SQL: Numeric or value error में परिणत होता है :

SQL> declare
  2      type varchar2_100_aa is table of varchar2(100) index by binary_integer;
  3      test varchar2_100_aa;
  4  begin
  5      dbms_output.put_line(test.count);
  6      dbms_output.put_line(coalesce(to_char(test.first), 'NULL'));
  7      dbms_output.put_line(coalesce(to_char(test.last), 'NULL'));
  8      test(1) := 'Hello';
  9      dbms_output.new_line;
 10      dbms_output.put_line(test.count);
 11      dbms_output.put_line(coalesce(to_char(test.first), 'NULL'));
 12      dbms_output.put_line(coalesce(to_char(test.last), 'NULL'));
 13  end;
 14  /
0
NULL
NULL

1
1
1

PL/SQL procedure successfully completed.

संपादित करें यह भी ध्यान दें कि सहयोगी सरणियाँ विरल हो सकती हैं। first . के बीच की संख्याओं पर लूपिंग और last किसी भी संग्रह के लिए अपवाद उठाएगा जो दुर्लभ है। इसके बजाय first . का उपयोग करें और next इस तरह:(last और prev दूसरी दिशा में लूप करने के लिए।)

SQL> declare
  2      type varchar2_100_aa is table of varchar2(100) index by binary_integer;
  3      test varchar2_100_aa;
  4      i binary_integer;
  5  begin
  6      test(1) := 'Hello';
  7      test(100) := 'Good bye';
  8      dbms_output.put_line(test.count);
  9      dbms_output.put_line(coalesce(to_char(test.first), 'NULL'));
 10      dbms_output.put_line(coalesce(to_char(test.last), 'NULL'));
 11      dbms_output.new_line;
 12  --
 13      i := test.first;
 14      while (i is not null) loop
 15          dbms_output.put_line(to_char(i, '999')  || ' - ' || test(i));
 16          i := test.next(i);
 17      end loop;
 18  end;
 19  /
2
1
100

   1 - Hello
 100 - Good bye

PL/SQL procedure successfully completed.


  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 में एक सीमांकित स्ट्रिंग (या कॉलम) को पंक्तियों में बदलना

  2. कॉलम में सटीक मिलान मिलने पर Oracle SQL में एक विशेष वर्ण कैसे जोड़ें?

  3. PL SQL का उपयोग करके Oracle तालिका से एक्सेल में डेटा निर्यात करें

  4. क्या ऑरैकल अप्रतिबद्ध पठन विकल्प की अनुमति देता है?

  5. लेनदेन समयबाह्य ओरेकल के साथ हाइबरनेट पर काम नहीं कर रहा