Oracle 存过 与Postgresql 的存过的差别-一、Oracle 存储过程

时间:2024-05-02 20:06:38
CREATE OR REPLACE PROCEDURE display_employees_with_cursor AS  
    -- 声明游标  
    CURSOR emp_cursor IS  
        SELECT employee_id, first_name, salary FROM employees;  
  
    -- 声明变量来存储从游标中检索的数据  
    v_employee_id   employees.employee_id%TYPE;  
    v_first_name    employees.first_name%TYPE;  
    v_salary        employees.salary%TYPE;  
BEGIN  
    -- 打开游标  
    OPEN emp_cursor;  
  
    -- 循环遍历游标中的每一行  
    LOOP  
        -- 从游标中检索数据  
        FETCH emp_cursor INTO v_employee_id, v_first_name, v_salary;  
  
        -- 退出循环的条件:如果没有更多的数据可检索(即游标已到达末尾)  
        EXIT WHEN emp_cursor%NOTFOUND;  
  
        -- 在这里处理每一行的数据。例如,我们可以简单地将它们打印到控制台(注意:在Oracle PL/SQL中,通常不会直接打印到控制台,但这里只是作为示例)  
        DBMS_OUTPUT.PUT_LINE('Employee ID: ' || v_employee_id || ', Name: ' || v_first_name || ', Salary: ' || TO_CHAR(v_salary));  
    END LOOP;  
  
    -- 关闭游标  
    CLOSE emp_cursor;  
EXCEPTION  
    WHEN OTHERS THEN  
        -- 异常处理:如果发生任何错误,关闭游标并重新抛出异常  
        IF emp_cursor%ISOPEN THEN  
            CLOSE emp_cursor;  
        END IF;  
        RAISE;  
END display_employees_with_cursor;

Oracle的变量申明弱限制,Pgsql 需要强制先申明后使用。