반응형
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
반응형
'programing' 카테고리의 다른 글
'MainController' 인수가 함수가 아니며 AngularJS에서 정의되지 않았습니다. (0) | 2023.09.27 |
---|---|
오라클 더 빠른 페이징 쿼리 (0) | 2023.09.27 |
jQuery : eq() vs get() (0) | 2023.09.27 |
Node.js: req.query[]와 req.param의 차이 (0) | 2023.09.27 |
러스트 코드에서 C나 C++ 함수를 호출할 수 있습니까? (0) | 2023.09.27 |