Announcement

Collapse
No announcement yet.

PLSQL - Colections

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • PLSQL - Colections

    Hallo,

    ich möchte einem Feld ein weiteres Feld zuweisen. So siehts aus:


    Code:
    create or replace function test
      type TListe is table of varchar2(40) index by binary_integer;
      badWords TListe;
    
    begin
      badWords = TListe('test', 'nix', 'schimpfwort');
    
      [...]
    
    end;
    Geht offensichtlich nicht. Aber hier: http://fara.cs.uni-potsdam.de/~uhlmann/19/ch11.html tun sie es. Was mache ich nur falsch?

    Chris

  • #2
    Die Syntax für die beiden Collection-Datentypen VARARRAY und INDEX BY Tabelle unterscheiden sich in einem wesentlichen Punkt:
    VARRAY: ohne INDEX BY definieren
    INDEX BY: mit INDEX BY definieren

    type TListe is table of varchar2(40) index by binary_integer;
    Hier wurde eine INDEX BY-Tabelle definiert.

    badWords = TListe('test', 'nix', 'schimpfwort');
    Diese Initialisierung darf aber nur bei einem VARARRAY benutzt werden. Bei eine INDEX BY-Tabelle muss jedes Element einzeln initialisiert werden.

    kuemmelchen

    Comment


    • #3
      Wenn Du mehrer Felder in deiner Collection hast, so musst Du diese auch definieren :
      TYPE trec_satz IS RECORD(
      feld01 VARCHAR2(40)
      ,feld02 VARCHAR2(40)
      ,feld03 VARCHAR2(40);
      TYPE ttbl_test IS TABLE OF trec_satz INDEX BY PLS_INTEGER;
      tbl_test ttbl_test;

      Comment


      • #4
        So gehts:
        Code:
        SET SERVEROUTPUT ON SIZE 1000000
        
        DECLARE
          TYPE TListe IS TABLE OF VARCHAR2(40); 
          badWords TListe;
        BEGIN
          badWords := TListe('test', 'nix', 'schimpfwort');
          FOR i IN badWords.FIRST .. badWords.LAST 
          LOOP
              dbms_output.put_line(badWords(i));
          END LOOP;
        END;
        
        test
        nix
        schimpfwort
        PL/SQL procedure successfully completed.

        Comment


        • #5
          oder so:

          Code:
          SET SERVEROUTPUT ON SIZE 1000000
          
          DECLARE
            TYPE TType  IS RECORD(wort VARCHAR2(40)); 
            TYPE TListe IS TABLE OF TType INDEX BY BINARY_INTEGER;
            badWords TListe;
          BEGIN
            badWords(3).wort := 'test';
            badWords(4).wort := 'nix';
            badWords(5).wort := 'schimpfwort';
            FOR i IN badWords.FIRST .. badWords.LAST 
            LOOP
                dbms_output.put_line(badWords(i).wort);
            END LOOP;
          END;
          
          test
          nix
          schimpfwort
          PL/SQL procedure successfully completed.

          Comment

          Working...
          X