2010-01-11 6 views
8

단순히 지정한 ID에 대한 커서를 다시 가져 오려고합니다.IN 절에 Oracle 테이블 형식 사용 - 컴파일 오류가 발생했습니다.

 
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 : ORA-22905 : 행에 액세스 할 수없는 표현은 잘못된 유형의
PL/SQL이다 중첩되지 않은 테이블 항목에서

어디로 잘못 가고 있습니까? 당신은 단지 CREATE TYPE 문을 통해 데이터베이스에 정의 된 콜렉션 유형을 선택할 수 있습니다

답변

10

, 하지 연관 배열이 인덱스별로 테이블, PL이다

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; 
+0

감사합니다.하지만 이제는 ORA-12714가 표시됩니다. 해당 행에 잘못된 국가 별 문자 집합이 지정되었습니다. 훨씬 더 가깝습니다. –

+1

완전히 다른 문제이므로 국가 별 문자 집합 문제에 대한 단서가 없기 때문에 이에 대한 또 다른 질문을 게시하고 싶을 수 있습니다. –

3

/SQL 유형.

Oracle의 SQL 엔진에서만 SQL 유형을 사용할 수 있습니다. 또는 PL/SQL 유형, 오라클은 SQL 유형과 같이 보이기 위해 해킹 할 수 있습니다.

간단한 배열과 같은 컬렉션을 만들어서 결과로 사용할 수 있습니다.

유형을 생성 TGuidList이 NVARCHAR의 테이블 인 (38) : (기준 인덱스)

type TGuidList is table of NVarchar(38); 

그러나 최고의 호환성과 안정성, 당신은 글로벌 SQL 유형으로 선언함으로써 얻을 및 패키지 내부에 있음 사용 ;

편집 : GUID 용 NVarChar가 필요하지 않습니까? 좋은 ol 'VarChar는 트릭을 잘해야합니다.

+0

NVarchar2를 사용해야합니다. 클라이언트의 고풍 데이터베이스 표준의 일부입니다 (SP가 전혀 사용되지 않는 이유이기도합니다). –

관련 문제