This discussion is archived
2 Replies Latest reply: Nov 25, 2013 5:12 AM by chris227 RSS

Erstellung eine komplexe SQL Prozedur

dcf517a4-6128-43e7-a8e5-ae864815e35b Newbie
Currently Being Moderated

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 Expert
    Currently Being Moderated

    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 Guru
    Currently Being Moderated

    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

Legend

  • Correct Answers - 10 points
  • Helpful Answers - 5 points