Announcement

Collapse
No announcement yet.

Multi Dimensional PLSQL Collections prüfen mit EXISTS

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

  • Multi Dimensional PLSQL Collections prüfen mit EXISTS

    Hallo,
    ich mochte eine Multi Dimensional PLSQL Collections mit EXISTS prüfen. Für den ersten Index funktioniert das. Wenn ich einen zweiten oder Dritten dazu nehme bekomme ich einen Fehler. Probiert habe ich folgendes, für Zeile 13: Trans.EXISTS( 'N' )( 'TABLE' )( 'SYS' )

    DECLARE
    TYPE tTra1 IS TABLE OF VARCHAR2 (200 Byte) INDEX BY VARCHAR2(30) ;
    TYPE tTra2 IS TABLE OF tTra1 INDEX BY VARCHAR2(60) ;
    TYPE tTra3 IS TABLE OF tTra2 INDEX BY VARCHAR2(30) ;
    Trans tTra3 ;
    BEGIN

    FOR hCur IN ( SELECT * FROM all_objects WHERE status = 'VALID' )
    LOOP
    Trans( hCur.TEMPORARY ) ( hCur.OBJECT_TYPE ) ( hCur.OWNER ) := hCur.OBJECT_NAME ;
    END LOOP ;

    IF Trans.EXISTS( 'N' ) THEN
    DBMS_OUTPUT.PUT_LINE( Trans( 'N' )( 'TABLE' )( 'SYS' ) ) ;
    END IF ;

    END ;

  • #2
    Die Ausgabe ist außerhalb der LOOP und hCur.OWNER wird mit OBJECT_NAME belegt - ist das so gewollt?
    Als Beispiel klappt:
    Code:
    SET SERVEROUTPUT ON SIZE 900000;
    
    DECLARE
      TYPE tTra1 IS TABLE OF VARCHAR2 (200 Byte) INDEX BY VARCHAR2(30) ;
      TYPE tTra2 IS TABLE OF tTra1 INDEX BY VARCHAR2(60) ;
      TYPE tTra3 IS TABLE OF tTra2 INDEX BY VARCHAR2(30) ;
      Trans tTra3 ;
    BEGIN
    
    FOR hCur IN ( SELECT * FROM all_objects WHERE status = 'VALID' AND rownum<=5)
      LOOP
        --Trans( hCur.TEMPORARY ) ( hCur.OBJECT_TYPE ) ( hCur.OWNER ) := hCur.OBJECT_NAME ;
        Trans( hCur.TEMPORARY ) ( hCur.OBJECT_TYPE ) ( hCur.OWNER ) := hCur.OWNER ;
        IF Trans.EXISTS( 'N' )
         THEN
          DBMS_OUTPUT.PUT_LINE( 'NAME='||hcur.object_name||' TEMPORARY='||hCur.TEMPORARY||' OWNER='||hcur.OWNER) ;
          DBMS_OUTPUT.PUT_LINE( Trans( 'N' )( 'TABLE' )( 'SYS' ) ) ;
         END IF ;
      END LOOP ;
    END; 
    
    
    
    NAME=ICOL$ TEMPORARY=N OWNER=SYS
    SYS
    NAME=I_USER1 TEMPORARY=N OWNER=SYS
    SYS
    NAME=CON$ TEMPORARY=N OWNER=SYS
    SYS
    NAME=UNDO$ TEMPORARY=N OWNER=SYS
    SYS
    NAME=C_COBJ# TEMPORARY=N OWNER=SYS
    SYS
    PL/SQL procedure successfully completed.

    Comment


    • #3
      Ja, das ist nur als Beispiel in einer Procedure. Im Loop fülle ich das 'array' und möchte später auf Elemente zugreifen, wenn diese vorhanden sind.
      Also mein Beispiel ist das richtige. Mir kommt es auf das "IF EXISTS" an.

      Danke

      Comment


      • #4
        Sieht aus, als ob du stufenweise durchgehen musst, so würde es gehen:

        [highlight=sql]
        IF Trans.EXISTS( 'N' ) THEN
        IF Trans( 'N' ).EXISTS( 'TABLE' ) THEN
        IF Trans( 'N' )( 'TABLE' ).EXISTS( 'SYS' ) THEN
        DBMS_OUTPUT.PUT_LINE( Trans( 'N' )( 'TABLE' )( 'SYS' ) ) ;
        END IF;
        END IF;
        END IF ;
        [/highlight]

        Gruss

        Comment


        • #5
          Funktoniert super, Danke. Mit einem IF geht es auch:
          IF Trans.EXISTS('N') AND Trans('N').EXISTS('TABLE') AND Trans('N')('TABLE').EXISTS( 'SYS' ) then
          DBMS_OUTPUT.PUT_LINE( Trans( 'N' )( 'TABLE' )( 'SYS' ) ) ;
          END IF ;

          Comment


          • #6
            Achso, dann versuche mal:
            Code:
            SET SERVEROUTPUT ON SIZE 900000;
            
            DECLARE
              TYPE tTra1 IS TABLE OF VARCHAR2 (200 Byte) INDEX BY VARCHAR2(30) ;
              TYPE tTra2 IS TABLE OF tTra1               INDEX BY VARCHAR2(60) ;
              TYPE tTra3 IS TABLE OF tTra2               INDEX BY VARCHAR2(30) ;
              Trans tTra3 ;
            BEGIN
            
            FOR hCur IN ( SELECT * FROM all_objects WHERE status = 'VALID' AND rownum<=5)
              LOOP
                --Trans( hCur.TEMPORARY ) ( hCur.OBJECT_TYPE ) ( hCur.OWNER ) := hCur.OBJECT_NAME ;
                Trans( hCur.TEMPORARY ) ( hCur.OBJECT_TYPE ) ( hCur.OWNER ) := hCur.OWNER ;
                IF Trans('N')('TABLE').EXISTS('SYS')
                 THEN
                  DBMS_OUTPUT.PUT_LINE( 'NAME='||hcur.object_name||' TEMPORARY='||hCur.TEMPORARY||' OWNER='||hcur.OWNER) ;
                  DBMS_OUTPUT.PUT_LINE( Trans( 'N' )( 'TABLE' )( 'SYS' ) ) ;
                 END IF ;
              END LOOP ;
            END ; 
            
            NAME=ICOL$ TEMPORARY=N OWNER=SYS
            SYS
            NAME=I_USER1 TEMPORARY=N OWNER=SYS
            SYS
            NAME=CON$ TEMPORARY=N OWNER=SYS
            SYS
            NAME=UNDO$ TEMPORARY=N OWNER=SYS
            SYS
            NAME=C_COBJ# TEMPORARY=N OWNER=SYS
            SYS
            PL/SQL procedure successfully completed.
            zu langsam, Du hast die Lösung schon selbst gefunden ...

            Comment


            • #7
              Originally posted by uminky View Post
              Mit einem IF geht es auch:
              Und was geht, wenn die 2. Dimension schon nicht existiert? (in diesem Fall unwahrscheinlich, aber ..)
              Grundsätzlich frag ich mich hier, ob Du mit dem Basis Select nicht Mehrfacheinträge bekommst. Objectname ist nur je schema eindeutig.
              Gruß, defo

              Comment


              • #8
                Code:
                IF Trans.EXISTS('N') AND Trans('N').EXISTS('TABLE') AND Trans('N')('TABLE').EXISTS( 'SYS') THEN
                Die Anweisung wird doch von links nach rechts ausgewertet (logischer Kurzschluss), so dass ein IF reichen sollte.

                Comment


                • #9
                  Originally posted by jum View Post
                  Code:
                  IF Trans.EXISTS('N') AND Trans('N').EXISTS('TABLE') AND Trans('N')('TABLE').EXISTS( 'SYS') THEN
                  Die Anweisung wird doch von links nach rechts ausgewertet (logischer Kurzschluss), so dass ein IF reichen sollte.
                  Korrekt!
                  Ich hab gepennt.
                  Gruß, defo

                  Comment

                  Working...
                  X