Exasol – object XXX not found

TLDR: Indentifiers in Exasol werden intern in Großbuchstaben gespeichert. Attribute in der Selektanweisung sollten in Anführungszeichen gesetzt werden.

Beobachtung

In Exasol habe ich eine benutzerdefinierte Python-Funktion erstellt und zwar wie folgt:

CREATE OR REPLACE PYTHON3 SCALAR SCRIPT "SCHEMA"."PARSE_XML" ("xml" VARCHAR(2000000) UTF8) 
EMITS ("parsed_column" VARCHAR(2000000) UTF8) AS
# Python script

Dann versuchte ich, die UDF in einer Select-Anweisung wie folgt aufzurufen:

With CTE( 
    SELECT parse_cml(column) as parsed_column
    FROM table )
Select parsed_column
FROM CTE

Allerdings erhielt ich die Fehlermeldung

object PARSED_COLUMN not found

Obwohl die Ausgabespalte in der UDF benannt und sogar in der CTE mit einem Alias versehen ist, konnte ich sie nicht direkt auswählen. Wenn ich dagegen SELECT * ausführe, wird die Spalte in der Ausgabe angezeigt wie sie in der UDF definiert wurde (in Kleinbuchstaben).

Hintergrund Information:

Wahrscheinlich relevant: “Regular identifiers are not case-sensitive but are always stored in UPPERCASE letters in the database.” (Exasol Docs)

Wenn in Exasol auf eine Spalte ohne Anführungszeichen verwiesen wird, wandelt die Datenbank den Spaltennamen automatisch in Großbuchstaben um. Dieses Verhalten gilt auch für Aliase; wenn ein Alias ohne Anführungszeichen angegeben wird, wandelt Exasol den Alias intern in Großbuchstaben um. Das erklärt auch, warum in der Fehlerausgabe das fehlende Objekt in Großbuchstaben angegeben wird.

Ich habe auch beobachtet, dass das Aliasing der UDF-Ausgabe anscheinend keine Wirkung hat. SELECT * FROM CTE würde immer noch denselben Spaltennamen wie in der UDF definiert ausgeben.

Lösung:

Das bedeutet also, dass nur die Ausgabespalte der UDF “parsed_column” bezeichnet wird, die Ausgabe der CTE ist aber “PARSED_COLUMN”.

Mit all diesen Informationen haben wir nun zwei Alternativen:

Umbenennung der Ausgabe der UDF in Großbuchstaben

CREATE OR REPLACE PYTHON3 SCALAR SCRIPT "SCHEMA"."PARSE_XML" ("xml" VARCHAR(2000000) UTF8) 
EMITS ("PARSED_COLUMN" VARCHAR(2000000) UTF8) AS
# Python script

Spalten in der SELECT-Anweisung mit Anführungszeichen

With CTE( 
    SELECT parse_xml(column)
    FROM table )
Select "parsed_column"
FROM CTE

Kommentar verfassen

Your email address will not be published. Required fields are marked *

hungsblog | Nguyen Hung Manh | Dresden
Nach oben scrollen