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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top