11

指定したIDのカーソルを取り戻そうとしているだけです。

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;

注:someschema.someentity.idはNVARCHAR2(38)です

PL/SQL: ORA-00382: expression is of wrong type
PL/SQL: ORA-22905: cannot access rows from a non-nested table item

どこが間違っているのですか?

4

2 に答える 2

13

12.2より前のバージョンのOracleでは、連想配列ではなく、 CREATETYPEステートメントを介してデータベースで定義されているコレクションタイプからのみSELECTできます。

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;
于 2010-01-11T23:04:31.660 に答える
3

これは、PL/SQLタイプである索引別表です。

SQLタイプは、OracleのSQLエンジンでのみ使用できます。または、OracleがSQLタイプのように見せかけることができるPL/SQLタイプ。

単純な配列のようなコレクションを作成して、結果として使用できます。(インデックスなし)

type TGuidList is table of NVarchar(38);

しかし、最高の互換性と安定性は、それをグローバルSQLタイプとして宣言し、パッケージ内で使用することで得られます。

作成タイプTGuidListはNVarchar(38)のテーブルです。

編集:GUIDにNVarCharは必要ありませんね。古き良きVarCharはうまくやってくれるはずです。

于 2010-01-11T23:25:34.750 に答える