문제

다음은 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.) 파이프 라인 기능. 기본적으로 함수는 테이블처럼 보이는 데이터를 반환합니다.

이 링크는 옵션을 요약하고 설명하는 여러 코드 목록이 있습니다.

http://www.databasejournal.com/features/oracle/article.php/3352091/casting-about-for-o-solution-using-cast-n-table-functions-in-plsql.htm

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top