programing

IN 절에서 Oracle Table Type을 사용하면 컴파일이 실패함

telecom 2023. 9. 27. 16:55
반응형

IN 절에서 Oracle Table Type을 사용하면 컴파일이 실패함

그냥 내가 지정한 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;

참고: 일부 도식.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

어디가 잘못됐나요?

12.2 이전 버전의 Oracle에서는 데이터베이스에 정의된 컬렉션 유형 중 연관 배열이 아닌 CREATE TYPE 문을 통해서만 선택할 수 있습니다.

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;

이것은 PL/SQL 유형인 인덱스 바이 테이블입니다.

SQL 유형은 Oracle의 SQL 엔진에서만 사용할 수 있습니다.또는 Oracle이 SQL 유형처럼 보이도록 해킹할 수 있는 PL/SQL 유형입니다.

단순한 배열 형태의 컬렉션을 사용하여 결과적으로 사용할 수 있습니다.(인덱스 없음)

type TGuidList is table of NVarchar(38);

하지만 최상의 호환성과 안정성은 글로벌 SQL 유형으로 선언함으로써 얻을 수 있으며 패키지 내에서 다음과 같이 사용할 수 있습니다.

NVarchar(38)의 type TGuidList 테이블을 만듭니다.

편집: GUID에 NVarChar가 필요 없겠죠?좋은 바르샤르가 잘 할 수 있을 겁니다.

언급URL : https://stackoverflow.com/questions/2045554/using-an-oracle-table-type-in-in-clause-compile-fails

반응형