programing

Oracle SQL 문 내에서 컬렉션을 사용하는 방법

magicmemo 2023. 7. 20. 21:50
반응형

Oracle SQL 문 내에서 컬렉션을 사용하는 방법

몇 가지 데이터를 여러 단계로 수집하는 Oracle 함수를 수집 변수에 작성하고 다음과 같이 SELECT 쿼리 내에서 해당 수집 데이터를 사용하고자 합니다.

CREATE OR REPLACE FUNCTION TESTFUNC01 RETURN VARCHAR2 AS 
  -- INT_LIST is declared globally as "TYPE INT_LIST IS TABLE OF INTEGER"
  MyList INT_LIST := INT_LIST();
  MyName VARCHAR2(512);
BEGIN
  MyList.Extend(3);
  MyList(0) := 1;
  MyList(1) := 2;
  MyList(2) := 3;

  SELECT Name INTO MyName
  FROM Item WHERE ItemId NOT IN MyList;
  RETURN MyName;
END TESTFUNC01;

유감스럽게도 "내 목록에 없음" 부분은 유효한 SQL이 아닙니다.이것을 달성할 수 있는 방법이 있습니까?

당신이 찾고 있는 것은table함수:

CREATE OR REPLACE FUNCTION TESTFUNC01 RETURN VARCHAR2 AS 
  -- INT_LIST is declared globally as "TYPE INT_LIST IS TABLE OF INTEGER"
  MyList INT_LIST := INT_LIST();
  MyName VARCHAR2(512);
BEGIN
  MyList.Extend(3);
  MyList(1) := 1;
  MyList(2) := 2;
  MyList(3) := 3;

  SELECT Name INTO MyName
  FROM Item WHERE ItemId NOT IN (select * from table(MyList));
  RETURN MyName;
END TESTFUNC01;

오라클 10을 사용하는 경우 컬렉션 확장을 사용할 수 있습니다.

CREATE OR REPLACE FUNCTION TESTFUNC01 RETURN VARCHAR2 AS 
  -- INT_LIST is declared globally as "TYPE INT_LIST IS TABLE OF INTEGER"
  MyList INT_LIST := INT_LIST();
  MyName VARCHAR2(512);
BEGIN
  MyList.Extend(3);
  MyList(1) := 1;
  MyList(2) := 2;
  MyList(3) := 3;

  SELECT Name INTO MyName
  FROM Item WHERE ItemId MEMBER OF MyList;
  RETURN MyName;
END TESTFUNC01;

자세한 내용은 이 게시물을 참조하십시오.

다음과 같이 할 수 있습니다.

CREATE OR REPLACE FUNCTION TESTFUNC01 RETURN VARCHAR2 AS 
  -- INT_LIST is declared globally as "TYPE INT_LIST IS TABLE OF INTEGER"
  MyList INT_LIST := INT_LIST();
  MyName VARCHAR2(512);
BEGIN
  MyList.Extend(3);
  MyList(1) := 1;
  MyList(2) := 2;
  MyList(3) := 3;

  SELECT Name INTO MyName
  FROM Item WHERE ItemId NOT IN (SELECT COLUMN_VALUE FROM TABLE(MyList));
  RETURN MyName;
END TESTFUNC01;

목록 인덱스도 변경했습니다.0이 아닌 1로 시작합니다.

INT_LIST는 전체적으로 "TYPE INT_LIST는 정수의 테이블"로 선언됩니다.

PL/SQL 선언처럼 보입니다.SELECT 문은 SQL 엔진을 사용합니다.즉, SQL에서 TYPE을 선언해야 합니다.

CREATE TYPE INT_LIST AS TABLE OF NUMBER(38,0);
/

그런 다음 SELECT 문에서 사용할 수 있습니다.

SELECT Name INTO MyName
FROM Item WHERE ItemId NOT IN (select * from table(MyList));

물론 쿼리에서 하나의 행만 반환하거나 프로그램에서 TOO_MANY_ROWS 예외를 처리해야 합니다.

언급URL : https://stackoverflow.com/questions/7569918/how-can-i-use-a-collection-within-an-oracle-sql-statement

반응형