Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Tại sao việc kiểm tra mảng kết hợp rỗng trong PL / SQL này không thành công?

Tôi giả sử điều này sẽ dẫn đến "Mảng kết hợp rỗng" được in. Giả định đó là sai đối với mảng kết hợp. Chúng tồn tại khi được khai báo, nhưng trống rỗng. Nó sẽ đúng cho các kiểu tập hợp PL / SQL khác:

So sánh:

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

Mảng biến được thực hiện đúng cách:

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.

Vì mảng kết hợp trống nên firstlast là null, đó là lý do tại sao ví dụ thứ hai của bạn dẫn đến 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.

CHỈNH SỬA Cũng lưu ý rằng các mảng kết hợp có thể thưa thớt. Lặp lại các số giữa firstlast sẽ đưa ra một ngoại lệ cho bất kỳ bộ sưu tập nào bị thưa thớt. Thay vào đó, hãy sử dụng first next như vậy:(Lastprev để lặp lại hướng khác.)

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. Làm cách nào để thêm mệnh đề where vào thực thể bảng tham gia Hibernate @OneToMany rõ ràng?

  2. Làm thế nào để hiển thị bản ghi có giá trị cao nhất trong Oracle?

  3. ORA-00932:kiểu dữ liệu không nhất quán:mong đợi - có CLOB

  4. Làm thế nào để tìm nạp Nhận xét từ Oracle 11g bằng JDBC?

  5. Nhập từ kiểm tra xác thực cơ sở dữ liệu oracle