执行所有行的过程

时间:2014-06-23 12:33:03

标签: sql oracle stored-procedures plsql

我有一个代码,它将 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

线。我实际上希望它跳过具有多个值的部分。我怎样才能做到这一点?感谢。

2 个答案:

答案 0 :(得分: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;

分享并享受。

答案 1 :(得分: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);

只返回1条记录(对于employee_id 1)。或

EXEC emp_info(NULL);

返回所有记录。