2016-04-18 6 views
1

Ich habe versucht, eine Oracle-Funktion in dem Tabellennamen, Spaltennamen und wo Zeichenfolge sind dynamische Parameter zu erstellen:Oracle-Funktion erstellen

CREATE OR REPLACE FUNCTION MYSCHEMA.myFunctionName( 
    tableName in nvarchar2, 
    columnName in nvarchar2, 
    whereStr in nvarchar2) 
RETURN nvarchar2 

IS nActive nvarchar2(2000); 

BEGIN 
    declare 
    querystr nvarchar2(2000) ; 
    result nvarchar2(2000); 
    begin 
    querystr :=' 
    select listagg('+columnName+','+','+') within group (order by '+columnName+') 
    from '+tableName+' where 1 = 1 '+whereStr+';'; 
    EXECUTE IMMEDIATE querystr 
    INTO result; 
     nActive := result; 
      RETURN (nActive); 
    end; 
END ; 
/

Aber es gibt mir eine Fehlermeldung „Warnung: kompiliert aber mit Kompilierungsfehlern“.

Was mache ich falsch?

+1

Verwenden 'show errors' oder fragen Sie die' user_errors' Ansicht, die die eigentlichen Übersetzungsfehler zu sehen. (SQL Developer hat auch einen Bereich, der sie anzeigt). Sie müssen nicht verzerrte Anführungszeichen in Ihrem dynamischen String und dem Concentation-Zeichen ('||' not '+') betrachten; Aber warum hat deine Listagg drei Argumente? –

Antwort

2
  1. Für concatenate Strings in Oracle Verwendung || nicht +
  2. Sie brauchen nicht ; am Ende execute immediate Query-String
  3. Sie müssen ' mit '' entkommen.

... als @Aleksej sagte

  1. Execute immediate Notwendigkeit Abfrage-String in CHAR or VARCHAR2;
  2. listagg Rückkehr entweder raw oder VARCHAR2

CREATE OR REPLACE FUNCTION MYSCHEMA.myFunctionName( 
    tableName in varchar2, 
    columnName in varchar2, 
    whereStr in varchar2) 
RETURN varchar2 
BEGIN 
    declare 
    querystr varchar2(2000) ; 
    result varchar2(2000); 
    begin 
    querystr :=' 
    select listagg('|| columnName || ', '','') within group (order by ' ||columnName ||') 
    from ' || tableName || ' where 1 = 1 ' || whereStr; 
    EXECUTE IMMEDIATE querystr INTO result; 
    return result; 
    end; 
END ; 
/
+0

Dank Kumpel ... Wahre Abfrage ist CREATE OR FUNCTION name REPLACE ( Tabellenname in varchar2, column in varchar2, whereStr in varchar2) RETURN varchar2 IS Nactive varchar2 (2000); BEGINN deklarieren querystr varchar2 (2000); Ergebnis VARCHAR2 (2000); beginne querystr: = ' wähle listagg (' || spaltenname || ',' ',' ') innerhalb der Gruppe (nach' || spaltenname || ') von' || Tabellenname || 'wo 1 = 1' || woStr; AUSFÜHREN SIE UNMITTELBAR querystr INTO-Ergebnis; nActive: = Ergebnis; RETURN (nAktiv); Ende; ENDE; / –

1

Sie müssen den Typ Ihrer Variablen ändern, wenn man bedenkt, dass

  • „Die Rückgabedatentyp RAW ist, wenn die Maßnahme Spalte ist RAW, ansonsten ist der Rückgabewert VARCHAR2“ (documentation)
  • EXECUTE muss ein VARCHAR2: So "Es vom Typ CHAR oder VARCHAR2 sein muss, nicht NCHAR oder NVARCHAR2"

:

declare 
    querystr varchar2(2000) ; 
    result VARCHAR2(32767); 
begin 
    ... 
Verwandte Themen