Verwenden eines Oracle -Tabellentyps in Klausel - Compile schlägt fehl
-
20-09-2019 - |
Frage
Versuchen Sie einfach, einen Cursor für die von mir angegebenen IDs zurückzubekommen.
CREATE OR REPLACE PACKAGE some_package AS TYPE t_cursor IS REF CURSOR; TYPE t_id_table IS TABLE OF NVARCHAR(38) INDEX BY PLS_INTEGER; PROCEDURE someentity_select( p_ids IN t_id_table, p_results OUT t_cursor); END; CREATE OR REPLACE PACKAGE BODY some_package AS PROCEDURE someentity_select( p_ids IN t_guid_table, p_results OUT t_cursor) IS BEGIN OPEN p_results FOR SELECT * FROM someschema.someentity WHERE id IN (SELECT column_value FROM TABLE(p_ids)); - fails here END; END;
Hinweis: someschema.someentity.id ist ein nvarchar2 (38)
PL/SQL: ORA-00382: Ausdruck ist vom falschen Typ
PL/SQL: ORA-22905: Von einem nicht Nestentabellenartikel kann nicht auf Zeilen zugreifen
Wo gehe ich falsch?
Lösung
In Oracle -Versionen vor 12.2 können Sie nur aus einem Sammelstyp auswählen, der in der Datenbank über eine Anweisung zum Erstellen von Type definiert ist. nicht ein assoziatives Array:
CREATE TYPE t_id_table IS TABLE OF NVARCHAR(38);
CREATE OR REPLACE PACKAGE some_package AS
PROCEDURE someentity_select(
p_ids IN t_guid_table,
p_results OUT SYS_REFCURSOR);
END;
CREATE OR REPLACE PACKAGE BODY some_package AS
PROCEDURE someentity_select(
p_ids IN t_guid_table,
p_results OUT SYS_REFCURSOR)
IS
BEGIN
OPEN p_results FOR
SELECT *
FROM someschema.someentity
WHERE id IN (SELECT column_value FROM TABLE(p_ids));
END;
END;
Andere Tipps
Dies ist eine Index-By-Tabelle, die ein PL/SQL-Typ ist.
Sie können nur SQL -Typen im SQL -Engine von Oracle verwenden. Oder PL/SQL -Typen, dieses Oracle kann sich hacken, um wie SQL -Typen auszusehen.
Sie können eine einfache Array-ähnliche Sammlung haben und sie als Ergebnis verwenden. (kein Index durch)
type TGuidList is table of NVarchar(38);
Aber die beste Kompatibilität und Stabilität, Sie erhalten es als globaler SQL -Typ und verwenden dies in Ihrem Paket:
Typ TuidList erstellen ist Tabelle von Nvarchar (38);
Bearbeiten: Sie benötigen keinen Nvarchar für einen GUID, oder? Ein guter alter Varchar sollte den Trick gut machen.