sql >> Database teknologi >  >> RDS >> Oracle

Hvorfor mislykkes denne check for null-associativ array i PL/SQL?

Jeg antager, at dette bør resultere i, at "Nul associative array" udskrives. Denne antagelse er forkert for associative arrays. De eksisterer, når de erklæres, men er tomme. Det ville være korrekt for andre typer PL/SQL-samlinger:

Sammenlign:

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

Variabelt array udført korrekt:

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.

Fordi den associative matrix er tom first og last er null, hvilket er grunden til, at dit andet eksempel resulterer i 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.

REDIGER Bemærk også, at associative arrays kan være sparsomme. Sløjfer over tallene mellem first og last vil rejse en undtagelse for enhver samling, der er sparsom. Brug i stedet first og next sådan:(Last og prev for at sløjfe den anden retning.)

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. mysql-forespørgsel for alle poster ikke i dag

  2. MySQL:Når proceduren er gemt, er parameternavnet det samme som tabelkolonnenavnet

  3. fjern ikke-numeriske tegn i en kolonne (tegn varierende), postgresql (9.3.5)

  4. Sådan får du sidste dag i måneden i mysql ved at give måned og år som input