2014-06-23 3 views
0

employee_id을 table1의 매개 변수로 사용하고 직원의 이름과 국적을 가져 오는 코드가 있습니다. 코드는 아래에 표시됩니다모든 행에 대해 프로 시저 실행

CREATE OR REPLACE PROCEDURE emp_info (
    e_id IN table1.employee_id%TYPE 
) 
IS 
    e_name  table1.full_name%TYPE; 
    e_nation table1.nationality%TYPE; 
BEGIN 
    SELECT full_name, nationality 
    INTO e_name, e_nation 
    FROM table1 
    WHERE employee_id = e_id and rownum = 1; 
    DBMS_OUTPUT.PUT_LINE ('Name=' || e_name || ' Country=' || e_nation); 

    EXCEPTION 
    WHEN OTHERS 
    THEN 
    DBMS_OUTPUT.PUT_LINE ('No data found for ' || e_id); 
END; 

절차가 작동하지만 문제는 절차를 실행할 때입니다. 나는 모든 가치를 동시에 원한다. 내가 어떻게 할 수 있니? Loop Cursor로 뭔가를해야한다고 생각하지만 그것을 관리 할 수 ​​없었습니다.

또한, 당신은

rownum = 1 

라인을 참조하십시오. 실제로 다중 값이있는 부분을 건너 뛰기를 원했습니다. 내가 어떻게 할 수 있니? 감사.

+0

어떤 RDBMS를 사용하고 있습니까? – Dhwani

+2

같은 시간에 _all 값을 정확히 의미하는 _은 무엇입니까? 예상 결과 세트를 제공 할 수 있습니까? – user75ponic

+0

Oracle Database를 사용하고 있습니다 – Solijoli

답변

1

커서를 사용하여 선택 기준과 일치하는 테이블의 모든 행을 읽고 처리하려는 것처럼 보입니다. 다음과 같은 것을 사용할 수 있습니다 :

CREATE OR REPLACE PROCEDURE emp_info (
    e_id IN table1.employee_id%TYPE 
) 
IS 
BEGIN 
    FOR aRow IN (SELECT full_name, nationality 
       FROM table1 
       WHERE employee_id = e_id) 
    LOOP 
    DBMS_OUTPUT.PUT_LINE ('Name=' || aRow.FULL_NAME || 
          ' Country=' || aRow.NATIONALITY); 
    END LOOP; 
EXCEPTION 
    WHEN NO_DATA_FOUND THEN 
    DBMS_OUTPUT.PUT_LINE ('No data found for ' || e_id); 
    WHEN OTHERS THEN 
    DBMS_OUTPUT.PUT_LINE('Error: ' || SQLCODE || ' ' || SQLERRM); 
END; 

공유하고 즐기십시오.

+0

이 절차를 어떻게 실행합니까? – Solijoli

+1

SQL * Plus에서 호출하는 경우 다음을 사용하십시오.'EXEC EMP_INFO (12345);'12345는 조회 할 EMPLOYEE_ID입니다. PL/SQL에서 호출하는 경우'EMP_INFO (12345); '를 사용하십시오. 행운을 빌어 요. –

0

커서를 사용해야합니다. 또한 모든 직원 또는 그 중 하나만 반환하도록 약간 확장 할 수 있습니다. 하나의 특정 레코드가 필요하면 id를 proc에 전달하십시오. 당신은 모든 레코드를 원하는 경우, NULL 통과 ..

CREATE OR REPLACE PROCEDURE emp_info(e_id IN table1.employee_id%TYPE) 
AS 

    CURSOR c_employees(e_id IN table1.employee_id%TYPE) IS 
    SELECT full_name, nationality 
    FROM table1 
    WHERE employee_id = e_id OR e_id IS NULL; 

    r_employees c_employees%rowtype; 

BEGIN 

    OPEN c_employees(e_id); 
    LOOP 
    FETCH c_employees into r_employees; 
    EXIT WHEN c_employees%NOTFOUND; 

     DBMS_OUTPUT.PUT_LINE ('Name=' || r_employees.full_name || ' Country=' || r_employees.nationality);  

    END LOOP; 
    CLOSE c_employees; 

END; 

을 다음과 같이하십시오

EXEC emp_info(1); 

이 (employee_id입니다 1) 단지 1 레코드를 반환합니다. 또는

EXEC emp_info(NULL); 

모든 레코드가 반환됩니다.

관련 문제