2009-08-28 10 views
7

간단한 절차를 씁니다. 선택 결과를 변수에 저장하려고합니다. "SELECT INTO"쿼리를 사용하지만이 작업을 수행 할 수 없습니다.오라클에서 선택 결과를 변수에 저장하는 방법

예 :

DECLARE 
    v_employeeRecord employee%ROWTYPE; 
BEGIN 
SELECT * INTO v_employeeRecord 
     FROM Employee WHERE Salary > 10; 
END; 
+0

는 간단한 예를 들어 당신이 얻을 메시지 오류를 제공 할 수 있습니까? –

+0

하나의 행만 저장할 수 있지만 선택 결과에는 많은 행이 포함됩니다. –

답변

11

당신은 몇 가지 옵션이 있습니다.

DECLARE 
    CURSOR v_employeeRecords IS 
      SELECT * FROM Employee WHERE Salary > 10; 
    v_employeeRecord employee%ROWTYPE; 
BEGIN 
    FOR v_employeeRecord IN v_employeeRecords LOOP 
      /* Do something with v_employeeRecord */ 
    END LOOP; 
END; 

을 또는 당신이 TABLE 변수를 만들 수 있습니다 : 당신은 커서로 해당 쿼리를 돌 수 있었다

DECLARE 
    v_employeeRecord employee%ROWTYPE; 
    v_employeeRecords IS TABLE OF employee%ROWTYPE; 
    i BINARY_INTEGER; 
BEGIN 
SELECT * BULK COLLECT INTO v_employeeRecords 
     FROM Employee WHERE Salary > 10; 

i := v_employeeRecords.FIRST; 
WHILE v_employeeRecords.EXISTS(i) LOOP 
    v_employeeRecord := v_employeeRecords(i); 
    /* Do something with v_employeeRecord */ 
    i := v_employeeRecords.NEXT(i); 
END; 
END; 

내가 오라클에서 이러한 샘플을 시도하지 않은, 그래서 당신은 컴파일러 오류가 발생할 수 있습니다 ..

+0

커서가 내 문제를 해결합니다. –

+2

당신은 "BULK COLLECT INTO"를 사용해야합니다. – jva

+0

@ jva : 잡아 주셔서 감사합니다! –

7

SELECT가 두 개 이상의 행을 반환하면 SELECT INTO 신택스를 사용할 수 없습니다.

당신은 resulte 세트를 탐색 루프를 구축해야합니다

Adam 당신이 명시 적 커서를 사용하는 것이 방법을 설명하고 대량 루프를 수집합니다. 난 당신이 간단한 루프가 가능 (암시 적 커서를 선언 섹션이 필요하지 않습니다) 구축 할 수 방법을 보여줍니다 :

BEGIN 
    FOR c_emp IN (SELECT * 
        FROM Employee 
        WHERE Salary > 10) LOOP 
     /* do something with each row, for example:*/ 
     UPDATE foo SET bar = bar + c_emp.salary WHERE id = c_emp.id; 
    END LOOP; 
END; 
+0

좋은 예, 감사합니다. –

관련 문제