2 Replies Latest reply: Nov 25, 2013 7:12 AM by chris227 RSS

    Erstellung eine komplexe SQL Prozedur

    dcf517a4-6128-43e7-a8e5-ae864815e35b

      Hallo,

       

      ich möchte eine SQL Prozedur erstellen, welche Folgendes tuen soll.

       

      Ich habe zwei Spalten: SUPPLIER_NAME, SUPPLIER_ADDRESS

       

      SUPPLIER_NAME = Name der Lieferanten gespeichert (es gibt auch Zeilen, welche keine Name eingetragen ist, aber die Lieferantenadressen ist immer eingetragen.

       

      SUPPLIER_ADDRESS = Adresse der Lieferanten gespeicher.

       

      Ich möchte mit eine Prozedur, die leere Zeilen in SUPPLIER_NAME finden,

      nachdem ich es gefunden habe, nehme ich die dazugehörige Lieferantenadresse und möchte mit den anderen Lieferantenadressen vergleichen.

       

      Bei eine Übereinstimmung, nehme ich das SUPPLIER_NAME von der übereinstimmten SUPPLIER_ADDRESS und schreibe die in die leere SUPPLIER_NAME.

       

      Ich hoffe, ich habe mich verständlich ausgedruckt.

       

      Dazu habe ich folgende Code erstellt.

       

      CREATE OR REPLACE PROCEDURE SEARCH_AND_FILL_IN (TABLE_SUPPLIER IS TABLE OF VARCHAR2 INDEX BY BINARY_INTEGER, TABLE_SUPPLIER_ADDRESS IS TABLE OF VARCHAR2 INDEX BY  BINARY_INTEGER) IS
              INDEX_SUPPLIER BINARY_INTEGER;
              INDEX_SUPPLIER_ADDRESS BINARY_INTEGER;  
              ROW TABLE_SUPPLIER%ROWTYPE;
        BEGIN
      
          INDEX_SUPPLIER := 1
            INDEX_SUPPLIER_ADDRESS :=1
      
          FOR EACH ROW IN TABLE_SUPPLIER LOOP
            IF TABLE_SUPPLIER(INDEX_SUPPLIER) IS NULL THEN
              FOR EACH ROW IN TABLE_SUPPLIER_ADDRESS LOOP
                IF TABLE_SUPPLIER_ADRESS(INDEX_SUPPLIER_ADDRESS) IS TABLE_SUPPLIER(INDEX_SUPPLIER) THEN
                  UPDATE TABLE_SUPPLIER SET TABLE_SUPPLIER(INDEX_SUPPLIER) = TABLE_SUPPLIER(INDEX_SUPPLIER_ADDRESS);
                ELSE
                  INDEX_SUPPLIER_ADDRESS := INDEX_SUPPLIER_ADDRESS + 1;
                END IF;
              END LOOP;
              INDEX_SUPPLIER_ADDRESS := 1;
            END IF;
            INDEX_SUPPLIER := INDEX_SUPPLIER +1;
          END LOOP;
      END;
      
      
      

       

      Wenn ich es ausführe bekomme ich folgende Meldung:

       

      FUNCTION AMI_CHAR2NUMBER kompiliert
      Errors: check compiler log
      
      
      

       

      die dazugehörige compiler log

       

      Projekt: sqldev.temp:/IdeConnections%23Ebis1.jpr
          C:\Users\Hasan H. Gümüs\AppData\Roaming\SQL Developer\EbisBereinigung.sql
              Fehler(1,46): PLS-00103: Encountered the symbol "IS" when expecting one of the following:     in out <an identifier> <a double-quoted delimited-identifier>    ... long double ref char time timestamp interval date binary    national character nchar
              Fehler(1,90): PLS-00103: Encountered the symbol "," when expecting one of the following:     . ( @ % ; not null range alter character
      
      
      
      

       

      Wenn ich danach meine Prozedure mit folgende Zeile ausführe:

       

      EXECUTE SEARCH_AND_FILL_IN(STAGE2_PURCHASES.SUPPLIER, STAGE2_PURCHASES.SUPPLIER_ADDRESS);
      
      
      

       

      Bekomme ich folgende Meldung:

       

      Fehler beim Start in Zeile 200 in Befehl:
      EXECUTE SEARCH_AND_FILL_IN(STAGE2_PURCHASES.SUPPLIER, STAGE2_PURCHASES.SUPPLIER_ADDRESS)
      Fehlerbericht:
      ORA-06550: line 1, column 43:
      PLS-00357: Table,View Or Sequence reference 'STAGE2_PURCHASES.SUPPLIER' not allowed in this context
      ORA-06550: line 1, column 7:
      PL/SQL: Statement ignored
      06550. 00000 -  "line %s, column %s:\n%s"
      *Cause:    Usually a PL/SQL compilation error.
      *Action:
      
      
      
      

       

      und die dazugehörige Compiler log zieht folgendermaßen aus:

       

      Projekt: sqldev.temp:/IdeConnections%23Ebis1.jpr
          C:\Users\Hasan H. Gümüs\AppData\Roaming\SQL Developer\EbisBereinigung.sql
              Fehler(15,1): PLS-00103: Encountered the symbol "UPDATE"
      
      
      
      

       

       

      Könnt ihr mir hierbei helfen?

       

      Was habe ich denn bei meine Prozedur falsch gemacht?

       

       

      Vielen Dank im Voraus

       

       

      Gruss

       

       

      Hasan

        • 1. Re: Erstellung eine komplexe SQL Prozedur
          Marwim

          Hello Hassan,

           

          the first error is to post the question in a completely unrelated forum -> SQL and PL/SQL

          TIP: How to find a forum or community

           

          The next is to post a german question in an English forum. We (meaning regular users) know that not everyone is a native speaker (I'm not) and therefore noone expects perfect grammar or flawless spelling.

           

          The error in your procedure is, that you cannot define a type in the parameter list of a procedure.

          Define the type e.g. in a package specification

          CREATE OR REPLACE PACKAGE my_types AS

          TYPE tab_suppliers IS TABLE OF VARCHAR2 INDEX BY BINARY_INTEGER;

          END my_types;

           

          Now you can use it as parameter type

          CREATE OR REPLACE PROCEDURE SEARCH_AND_FILL_IN (

          TABLE_SUPPLIER   my_types.tab_suppliers

          ...

           

           

          Regards

          Marcus

          • 2. Re: Erstellung eine komplexe SQL Prozedur
            chris227

            What about pure sql?

             

            merge into table_supplier s

            using (

              select distinct

                SUPPLIER_ADDRESS

               ,SUPPLIER_NAME

              from table_supplier

              where

              SUPPLIER_NAME is not null

            ) n

            on ( s.SUPPLIER_ADDRESS = n.SUPPLIER_ADDRESS)

            when matched then update

            set s.SUPPLIER_NAME=n.SUPPLIER_NAME

            where s.SUPPLIER_NAME is null

             

            Message was edited by: chris227: column SUPPLIER_NAME added