ORACLE: Tablefunction mit variabler anzahl von Spalten

J-C

Mitglied
Hallo, ich habe eine Funktion, die eine Tabelle liefern soll... die Objekte um die (variable Spaltenanzahl der) Tabelle anzuzeigen funktioniert und wird vor dieser Funktion aufgerufen. Ich erhalte jedoch immer einen Fehler:

Es tritt nun ein neuer Fehler auf, nachdem ich Ishinos Rat befolgt habe:
ORA-00932: Inconsistent Datatypes: ....

Es scheint so, als wenn er den Rückgabewert von EXECUTE IMMEDIATE nicht in v_row speichern kann - aber warum der Type wird jedesmal vor aufruf dieser Funktion mit entsprechender Spaltenanzahl angelegt...



Die Funktion Preis liefert einen Wert vom Typ Number.

Ich hoffe jemand sieht den Fehler...

Code:
create or replace
FUNCTION WARTUNGSKOSTENTABELLE
( Von IN DATE
, Bis IN DATE
) RETURN WARTUNGSKOSTENTABELLE_T PIPELINED AS
BEGIN
  DECLARE
  
  v_sqlquery VARCHAR(4000);
  
  v_von DATE;
  v_bis DATE;
  
  v_maschine_wartung VIEW_MASCHINE_WARTUNG%ROWTYPE;
  
  v_row WARTUNGSKOSTENTABELLE_R;
  
  CURSOR maschine_wartung IS
  SELECT 
    VIEW_MASCHINE_WARTUNG.MASCHINE_ID, 
    VIEW_MASCHINE_WARTUNG.MASCHINE_TYP_ID, 
    VIEW_MASCHINE_WARTUNG.ANSPRECHPARTNER_INTERN_ID, 
    VIEW_MASCHINE_WARTUNG.STANDORT_ID, 
    VIEW_MASCHINE_WARTUNG.WARTUNG_ID, 
    VIEW_MASCHINE_WARTUNG.RAHMENVERTRAG_ID, 
    VIEW_MASCHINE_WARTUNG.WARTUNGSVERTRAG_ID, 
    VIEW_MASCHINE_WARTUNG.MASCHINE_NAME, 
    VIEW_MASCHINE_WARTUNG.MASCHINE_SERIENNUMMER, 
    VIEW_MASCHINE_WARTUNG.MASCHINE_IDG, 
    VIEW_MASCHINE_WARTUNG.MASCHINE_ANLAGENNUMMER, 
    VIEW_MASCHINE_WARTUNG.MASCHINE_BST, 
    VIEW_MASCHINE_WARTUNG.MASCHINE_RKST, 
    VIEW_MASCHINE_WARTUNG.MASCHINE_KAUFVERTRAGSNUMMER, 
    VIEW_MASCHINE_WARTUNG.MASCHINE_BESCHREIBUNG, 
    VIEW_MASCHINE_WARTUNG.MASCHINE_GEWAEHRLEISTUNG_START, 
    VIEW_MASCHINE_WARTUNG.MASCHINE_GEWAEHRLEISTUNG_ENDE, 
    VIEW_MASCHINE_WARTUNG.MASCHINE_TYP, 
    VIEW_MASCHINE_WARTUNG.ANSPRECHPARTNER_INTERN, 
    VIEW_MASCHINE_WARTUNG.WARTUNGSVERTRAG_NUMMER, 
    VIEW_MASCHINE_WARTUNG.RAHMENVERTRAG_NUMMER, 
    VIEW_MASCHINE_WARTUNG.STANDORT, 
    VIEW_MASCHINE_WARTUNG.WARTUNG_LAUFZEIT_START, 
    VIEW_MASCHINE_WARTUNG.WARTUNG_LAUFZEIT_ENDE, 
    VIEW_MASCHINE_WARTUNG.WARTUNG_GEANDERT_AM, 
    VIEW_MASCHINE_WARTUNG.WARTUNG_GEKUENDIGT_ZUM, 
    VIEW_MASCHINE_WARTUNG.WARTUNG_HWSW, 
    VIEW_MASCHINE_WARTUNG.WARTUNG_BEMERKUNG, 
    VIEW_MASCHINE_WARTUNG.WARTUNG_BETRIEBSSYSTEM, 
    VIEW_MASCHINE_WARTUNG.WARTUNG_BACKUP, 
    VIEW_MASCHINE_WARTUNG.WARTUNG_LISTENPREIS_IG, 
    VIEW_MASCHINE_WARTUNG.WARTUNG_LISTENPREIS_OG, 
    VIEW_MASCHINE_WARTUNG.WARTUNG_RABATT, 
    VIEW_MASCHINE_WARTUNG.WARTUNG_ANZAHL, 
    VIEW_MASCHINE_WARTUNG.WARTUNG_WARTUNGSLEVEL 
  FROM 
    VIEW_MASCHINE_WARTUNG;
  
  BEGIN

    OPEN maschine_wartung;
    LOOP
      FETCH maschine_wartung INTO v_maschine_wartung;
      
        v_von := TO_DATE('01.'||TO_CHAR(Von, 'MM.YYYY'), 'DD.MM.YYYY');
        v_bis := TO_DATE('01.'||TO_CHAR(Bis, 'MM.YYYY'), 'DD.MM.YYYY');
        
        v_sqlquery := 'SELECT ' || v_maschine_wartung.WARTUNG_ID;
        LOOP
          v_sqlquery := v_sqlquery || ', ' || Preis( v_von
          , v_maschine_wartung.MASCHINE_GEWAEHRLEISTUNG_START
          , v_maschine_wartung.MASCHINE_GEWAEHRLEISTUNG_ENDE
          , v_maschine_wartung.WARTUNG_LAUFZEIT_START
          , v_maschine_wartung.WARTUNG_LAUFZEIT_ENDE
          , v_maschine_wartung.WARTUNG_GEKUENDIGT_ZUM
          , v_maschine_wartung.WARTUNG_LISTENPREIS_IG
          , v_maschine_wartung.WARTUNG_LISTENPREIS_OG
          , v_maschine_wartung.WARTUNG_RABATT
          , v_maschine_wartung.WARTUNG_ANZAHL );
          v_von := ADD_MONTHS( v_von, 1 );          
        EXIT WHEN v_von > v_bis;
        END LOOP;  
        v_sqlquery := v_sqlquery ||  ' FROM DUAL';
        EXECUTE IMMEDIATE v_sqlquery INTO v_row;
      PIPE row( v_row );
    EXIT WHEN maschine_wartung%NOTFOUND;
    END LOOP;
  RETURN;
  END;
END WARTUNGSKOSTENTABELLE;
 
Zuletzt bearbeitet:
Bin mir nicht sicher, aber wenn du sagst die Spaltenanzahl passt dann würde ich mal versuchen die PipelineTableFunction nach der Änderung des Types neu zu kompilieren.

Einfach mit
Code:
ALTER FUNCTION WARTUNGSKOSTENTABELLE COMPILE
/

Vielleicht hat er damit Probleme, wenn sich der referenzierte Typ geändert hat ?!
 
Zurück