# Oracel: View Primary Key hinzufügen



## schneubel (24. Januar 2009)

Hi,

eine wahrscheinlich einfache Frage, doch als Oracle Einsteiger hab ich's noch nich hingekriegt:

ich habe eine view erstellt, die soweit funktioniert und daten anzeigt, bis auf folgende fehlermeldung: "ORA-01445: Kann keine ROWID aus einer Join-View ohne Basistabelle (der View) auswählen oder erfassen".

Wenn ich es richtig verstehe, bedeutet das, dass die View keinen eindeutigen PK hat und damit die Tupel nicht eindeutig identifiziert werden können.

Also hab ich fix nen PK-Constraint hinzugefügt, der auch fehlerlos erstellt wurde. Trotzdem bekomme ich die gleiche Fehlermeldung. Woran könnt's liegen? 


Code zum Generieren der View:

CREATE OR REPLACE VIEW teilnehmerlisten AS 
  SELECT semV.veranstaltungsnummer, b.buchungsnummer, b.personennummer, semV.seminarkurztitel, st.seminartitel , k.anrede, k.vorname, k.nachname, k.firmenkurzname Firma, semv.raumnr
  from ((buchung b inner join seminarveranstaltung semV On b.veranstaltungsnummer = semV.veranstaltungsnummer ) inner join kunde k on b.personennummer = k.personennummer) 
  LEFT OUTER JOIN seminartyp st on semv.seminarkurztitel = st.seminarkurztitel order by veranstaltungsnummer;​

Code zum PK-Constraint:

alter view teilnehmerlisten
add constraint teilnehmerlisten_pk
primary key (buchungsnummer)
disable novalidate;​
Noch 2 Einsteigerfragen:
1) "Buchungsnummer" ist PK in der Ausgangstabelle "Buchungen". Übernimmt Oracle beim Erstellen der View diesen nicht automatisch als PK? 

2) Kann man Views Spalten hinzufügen (bspw.: alter view add column xyz?) Wollte eine Spalte mit Berechnungsergebnissen anfügen... Was wäre hier die eleganteste Methode?

Tausend Dank für Tips und Anregungen!
schneubel

PS: DBMS = Oracle 10g


----------



## Exceptionfault (26. Januar 2009)

Wenn deine View funktioniert und Daten liefert, wann genau kommt dann diese Fehlermeldung?

Laut Doku tritt dieser Fehler dann auf, wenn in einem SELECT Statement die Pseudospalte ROWID abgefragt wirde, diese auf Grund von JOINS aber nicht bestimmbar ist bzw. nicht eindeutig ist. Dein Statement enthält aber keine Abfrage nach der ROWID, deshalb ist diese Meldung etwas seltsam. Im Oracle Metalink habe ich eine Bugnote (4369235) gefunden. Betroffen sind alle Datenbanken der Versionen < 10.1.0.4 und < 10.2.0.1. 


```
ORA-1445 can occur for ANSI join queries with large views/subqueries.

Workaround:
  Transform the ansi join queries manually.
```

Prinzipiell ist mir nicht ganz klar warum man einen PK auf eine VIEW anlegen sollte. Eine VIEW ist lediglich ein gespeichertes SELECT Statement und trägt somit nicht zur referentiellen Integrität bei. Damit sollte auch klar werden wie eine Spalte hinzugefügt werden kann: Mit Neuerstellung der View. Das gespeicherte SELECT Statement welches die VIEW ausmacht muss einfach ersetzt werden. Daher auch "CREATE OR REPLACE ..."


----------



## schneubel (26. Januar 2009)

Hi,

vielen Dank für Deine Antwort. 

1) ich hab die Query mal in hoffentlich Oracle-Standard umgeschrieben:

CREATE OR REPLACE VIEW teilnehmerlisten AS 
SELECT semV.veranstaltungsnummer, b.buchungsnummer, b.personennummer, semV.seminarkurztitel, st.seminartitel , k.anrede, k.vorname, k.nachname, k.firmenkurzname Firma, semv.raumnr
from buchung b, seminarveranstaltung semV, kunde k, seminartyp st where b.veranstaltungsnummer = semV.veranstaltungsnummer AND b.personennummer = k.personennummer AND semv.seminarkurztitel = st.seminarkurztitel(+) order by veranstaltungsnummer;​
Die Fehlermeldung bleibt leider... 

2) Ich schreibe meinen Code im SQL-Developer und die Fehlermeldung tritt immer dann auf, wenn ich im DB-Objektexplorer (linke Seite) auf die View klicke und dann in die Datenansicht wechsle. Wobei die Daten dann wie gesagt trotzdem richtig angezeigt werden. Sollte ich die Fehlermeldung einfach ignorieren? 

3) Dein Punkt mit dem PK auf Views ist mir klar geworden. D.h. also, wenn ich die Ergebnismenge des Selects bspw. in einer Prozedur weiterverarbeiten möchte, dann würde der einzelne Record der View nicht an einem PK-Schlüssel identifiziert werden, sondern schlicht an der Zeilennummer, in der das jeweilige Ergebnis steht? Theoretisch hätte dann die Sortieranweisung order by einen Einfluss auf die Nummer des Records? Nur mal so zum Verständnis...

Den Code führe ich übrigens auf "Oracle Database 11g Enterprise Edition Release 11.1.0.6.0" hab mich das letzte mal vertan... :-( 

Viele Grüße, schneubel


----------

