我有一个代码,它将 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 :(得分: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);
返回所有记录。