2017-08-17 5 views
1

ich plsql Skript Ich schreibe und ich erhalte eine Fehlermeldung bei der Ausführung in dem Teil, wenn ich verwenden ROW_NUMBER() OVER (PARTITION BY ...: dies die Linie meiner Code, der mir diesen Fehler geben: inkonsistente Datentypen: erwartet - bekam CLOB-Warum habe ich diesen Fehler in der Ausführung dieses Skripts (plsql Orakel)

Dies ist mein Code:

CREATE OR REPLACE VIEW "VW_APP_PU_LOCATION_CLUSTER" ("ID", "BATCH_ID", "PRODUCTION_SYSTEM_ID", "CODE", "URGENCY", "CURRENT_STATE", "VALUE", "ELEMENT_ID","VIEW_ID") AS 
    SELECT app.id AS id 
    ,  app.batch_state AS batch_id 
    ,  app.production_system_id AS production_system_id 
    ,  atp.code AS code 
    ,  app.urgency_code AS urgency 
    ,  app.current_state AS current_state 
    ,  dbms_lob.substr(el.value, 4000, 1) AS value 
    ,  el.element_id AS element_id 
    , ROW_NUMBER() OVER (PARTITION BY LOWER(el.value) ORDER BY loc.code) AS view_id  
    FROM application app 
    CROSS JOIN application_type atp 
    CROSS JOIN location loc 
    CROSS JOIN application_order ord 
    LEFT JOIN data_element el ON (app.id = el.application_id AND el.element_id = isexistsparam('Pu Generation','SORTING_DATA_ELEMENT')) 
    WHERE app.application_type_id = atp.id 
    AND app.location_id = loc.id 
    AND app.application_order_id = ord.id 
    AND app.current_state in 
    (
     select distinct sd.state 
     from process_state_definition psd, 
     state_definition sd, 
     application_type appType, 
     application appli, 
     process_definition pd 
     Where 
     ((appType.code is null)or (appType.id = appli.application_type_id AND sd.id = psd.state_definition_id) 
     AND psd.application_type_id = appType.id 
     AND psd.process_definition_id = pd.id 
     AND psd.state_type='START' 
     AND pd.name = 'Pu Generation') 
    )  
    ORDER BY loc.code asc, 
CASE WHEN isexistsparam('Pu Generation', 'SORTING_DATA_ELEMENT') != -1 
THEN dbms_lob.substr(el.value, 4000, 1) ELSE NULL 
END 
    ,  ord.date_ordered asc 
    ,  app.application_number asc; 

enter image description here

kann mir jemand erklären, was mit ROW_NUMBER() Funktion Dank falsch ist

+0

Was ist der Zweck dieser CROSS Joins (zusammengefügt mit WHERE-Klauseln)? – wildplasser

Antwort

2

Es gibt restriction:

Sie nicht LOB-Spalten in der ORDER BY-Klausel einer Abfrage oder in der GROUP BY-Klausel angeben einer Abfrage oder in einer Aggregatfunktion.

Sie können CLOB in CHAR umwandeln, wenn der Wert weniger als 4000 Zeichen beträgt.

* Meine Erklärung oder wie ich verstehe: ROW_NUMBER ist die analytische Funktion. Analytische Funktionen berechnen einen Aggregatwert basierend auf einer Gruppe von Zeilen. Wir haben PARTITION BY, die Daten basierend auf der LOB-Spalte gruppiert. Also, um Einschränkung der Rückkehr:

Sie nicht LOB-Spalten ... in der GROUP BY-Klausel einer Abfrage angeben ...

** Sorry für mein Englisch.

+0

können Sie erklären, mehr plz immer noch verwirrt darüber –

+0

@Errabi Ayoub fügen Sie meine Vision des Problems – I3rutt

+0

Sie haben Recht, wenn ich meine Funktion in ROW_NUMBER() OVER (PARTITION DURCH UNTEREN (TO_CHAR (el.value)), ord.date_ordered , app.application_number ORDER BY loc.code) AS view_id Es ist Arbeit! Vielen Dank !! –

Verwandte Themen