bestsource

Oracle에서 선언/시작/종료 블록에서 행을 반환하는 방법은 무엇입니까?

bestsource 2023. 7. 18. 21:50
반응형

Oracle에서 선언/시작/종료 블록에서 행을 반환하는 방법은 무엇입니까?

선언/시작/종료 블록 내의 선택 문에서 행을 반환합니다.T-SQL로 할 수 있는데 PL/SQL로 할 수 있는 방법을 알고 싶습니다.

코드는 다음과 같습니다.

declare
     blah number := 42;
begin
     select *
     from x
     where x.value = blah;
end;

당신이 보여준 것과 같은 익명의 PL/SQL 블록은 아무것도 "반환"할 수 없습니다.그러나 바인딩 변수를 사용하여 호출자와 상호 작용할 수 있습니다.

따라서 이 경우에 사용할 방법은 커서 참조를 선언하고, 원하는 쿼리에 대해 PL/SQL 블록에서 열고, 호출하는 응용 프로그램이 행을 가져올 수 있도록 하는 것입니다.SQL Plus에서 이는 다음과 같습니다.

variable rc refcursor

declare
     blah number := 42;
begin
  open :rc for
     select *
     from x
     where x.value = blah;
end;
/

print x

PL/SQL을 저장된 함수로 다시 캐스트하면 값이 반환될 수 있습니다.이 경우 컬렉션 유형을 생성하고 모든 행을 해당 유형의 변수로 가져온 다음 반환할 수 있습니다.

CREATE TYPE number_table AS TABLE OF NUMBER;

CREATE FUNCTION get_blah_from_x (blah  INTEGER)
  RETURN number_table
  IS
    values  number_table;
  BEGIN
    SELECT id
      BULK COLLECT INTO values
      FROM x
      WHERE x.value = blah;
    RETURN values;
  END;
/

데이터 액세스 라이브러리에 따라 크게 달라집니다.

모든 SQL 호환 유형을 매개 변수로 반환할 수 있습니다.여기에는 복잡한 SQL 유형 및 컬렉션 유형이 포함됩니다.그러나 대부분의 라이브러리는 Oracle의 개체 유형을 처리할 수 없습니다.

어느 쪽이든, 내 예에서는 다음과 같은 개체 유형을 사용합니다.

create type SomeType as object(Field1 VarChar(50));

create type SomeTypeList as table of SomeType;

액세스 라이브러리가 개체 유형을 처리할 수 있는 경우 PL/SQL 개체 목록을 반환하기만 하면 됩니다.

begin
  :list := SomeTypeList(SomeType('a'),SomeType('b'),SomeType('c'));
end;

그렇지 않은 경우 이 목록을 강제로 선택하고 결과를 커서로 반환하여 해킹할 수 있습니다.

declare
  list SomeTypeList;
begin
  list := SomeTypeList(SomeType('a'),SomeType('b'),SomeType('c'));
  open :yourCursor for
    SELECT A
    FROM   table(list);
end;

언급URL : https://stackoverflow.com/questions/3371408/how-to-return-rows-from-a-declare-begin-end-block-in-oracle

반응형