# PL/SQL: Join mit Collection



## Guest (5. Aug 2006)

Hi,

kennt sich jemand mit PL/SQL aus?

Ich habe folgende Datentypen

```
CREATE OR REPLACE TYPE ArtikelType AS OBJECT
(
  ArtikelId NUMBER,
  ...
);

CREATE TYPE ArtikelCollectionType AS TABLE OF ArtikelType;

CREATE OR REPLACE TYPE WarenkorbItemType AS OBJECT
(
  ArtikelId NUMBER,
  ...
);

CREATE TYPE WarenkorbItemCollectionType AS TABLE OF WarenkorbItemType;
```
und möchte alle Artikel kriegen, die in einem gegebenen Warenkorb enthalten sind.
(ArtikelView liefert Objekte vom Typ ArtikelType aus der Artikel-Tabelle)

```
PROCEDURE GetArtikel
(
  warenkorbItemCollection IN WarenkorbItemCollectionType,
  artikelCollection OUT ArtikelCollectionType
)
IS
  CURSOR ArtikelCursor
  IS
    SELECT VALUE(Artikel)
    FROM ArtikelView Artikel,
         TABLE(warenkorbItemCollection) Warenkorb
    WHERE Artikel.ArtikelId = Warenkorb.ArtikelId  <-- Hier kommt der Fehler (Warenkorb.ArtikelId unbekannt)
  ;
BEGIN
  OPEN ArtikelCursor;
  FETCH ArtikelCursor BULK COLLECT INTO artikelCollection;
  CLOSE ArtikelCursor;
END;
```
In der WHERE Clause wird ein Fehler gemeldet (Unbekannter Spaltenname)
Ich kann mir nicht erklären, was daran falsch sein kann.

Jemand eine Idee?

Eine alternative Lösung, wo ich eine Liste von ArtikelIds in WHERE Clause 
angebe, wäre auch OK. Irgendwie wie folgt
	
	
	
	





```
SELECT VALUE(Artikel)
FROM ArtikelView Artikel
WHERE Artikel.ArtikelId IN ( Liste der Ids aus warenkorbItemCollection, nur wie?)
```
Ich kann die ArtikelIds aus der warenkorbItemCollection auslesen, nur wie kriege ich 
sie in IN (...) rein?


----------



## DP (7. Aug 2006)

ja wie wohl? mit einer schleife (der vector enthält die artikelnummern aus dem warenkorb):


```
//Vector v;
      StringBuffer sql = new StringBuffer("select * from artikel where ");
      
      for(int i = 0; i < v.size(); i++){
        if(i > 0){
          sql.append(" and ");
        }
        sql.append(" ArtikelId = ");
        sql.append(v.get(i));
      }

      ResultSet rs = stmt.executeQuery(sql.toString());
```

feierabend


----------



## Guest (7. Aug 2006)

DP hat gesagt.:
			
		

> ja wie wohl? mit einer schleife (der vector enthält die artikelnummern aus dem warenkorb)


Danke, aber das ist die falsche Baustelle für sowas. Die PL/SQL Prozedur ist nicht Javaseitig, 
sondern "in Oracle" definiert. Diese wird in Java nur aufgerufen bzw. nicht mal das, da es
indirekt über andere Prozeduren geht. Ich habe es hier nur vereinfacht gezeigt, um das
Problem zu beschreiben.

Übrigens, selbst wenn es javaseitig wäre, würde deine Abfrage nie ein Ergebnis liefern. (denk mal darüber nach )


----------



## Guest (7. Aug 2006)

Problem hat sich erledigt. Der Code oben ist korrekt. Der Fehler war ein anderer, der 
damit nichts zu tun hatte.  :autsch:


----------



## DP (7. Aug 2006)

êine schleife in der stored proc machen?!

_Übrigens, selbst wenn es javaseitig wäre, würde deine Abfrage nie ein Ergebnis liefern._

da bin ich mal gespannt


----------



## Guest (7. Aug 2006)

DP hat gesagt.:
			
		

> êine schleife in der stored proc machen?!


Nöö, es geht schon wie oben gezeigt mit der Collection und dem Join.  (Es ist keine Java-Collection 
sondern PL/SQL-Collection) Ich habe dummerweise einen Tippfehler im Code gehabt. So gesehen
war die Fehlermeldung OK, nur ich war zu doof um darauf zu vertrauen. 



			
				DP hat gesagt.:
			
		

> _Übrigens, selbst wenn es javaseitig wäre, würde deine Abfrage nie ein Ergebnis liefern._
> 
> da bin ich mal gespannt


OK, wenn nur ein Wert im übergebenen Vektor drin ist. 
Bei 0 knallt's und bei > 1 kommt sicherlich nix.


----------

