문제
다음은 PL-SQL (Oracle)에서 할 수있는 것의 단순화 된 의사 코드 버전입니다.
DECLARE
mylist as ARRAY
BEGIN
mylist (1) := '1'
mylist (2) := '3'
...
SELECT *
FROM aTable
WHERE aKey IN mylist;
END;
SELECT는 MyList (1), MyList (2) 등의 일치하는 레코드를 반환해야합니다. 모든 값을 방출하는 것과 유사해야하지만 물론 우리는 얼마나 많은 값을 얻는지 미리 알 수 없습니다.
이것을 어떻게 달성 할 수 있습니까? PL/SQL에는 수집 데이터 유형이 있지만 SQL 문서에서 제대로 작동하는 것 같습니다.
아이디어에 감사드립니다.
해결책
이것은 쉽게 할 수 있습니다 TABLE()
기능. 하나의 캐치는 배열 변수가 SQL로 선언 된 유형을 사용해야한다는 것입니다. 이 때문입니다 SELECT
SQL 엔진을 사용하므로 PL/SQL 선언은 범위를 벗어납니다.
SQL> create or replace type numbers_nt as table of number
2 /
Type created.
SQL>
SQL> declare
2 l_array numbers_nt;
3 begin
4 l_array := numbers_nt (7521,7566,7654);
5 for r in ( select ename
6 from emp
7 where empno in ( select *
8 from table (l_array)
9 )
10 )
11 loop
12 dbms_output.put_line ( 'employee name = '||r.ename);
13 end loop;
14 end;
15 /
employee name = PADFIELD
employee name = ROBERTSON
employee name = BILLINGTON
PL/SQL procedure successfully completed.
SQL>
다른 팁
몇 가지 제안 :
1.) 작업을 수행 할 수있는 캐스트 SQL 키워드가 있습니다 ... 컬렉션을 테이블처럼 취급하게합니다.
2.) 파이프 라인 기능. 기본적으로 함수는 테이블처럼 보이는 데이터를 반환합니다.
이 링크는 옵션을 요약하고 설명하는 여러 코드 목록이 있습니다.
제휴하지 않습니다 StackOverflow