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
'bestsource' 카테고리의 다른 글
플라스크에서 비동기 태스크 만들기 (0) | 2023.07.18 |
---|---|
특정 열을 제외한 DataFrame의 모든 열을 삭제하는 방법은 무엇입니까? (0) | 2023.07.18 |
전체 디렉터리 트리에 대한 줄 끝 부분 변환(Git) (0) | 2023.07.18 |
대용량 .csv 파일 읽기 (0) | 2023.07.18 |
패키지 하위 디렉터리의 데이터 액세스 (0) | 2023.07.18 |