-- 方法一,定义一个包(Package)和包体(Package Body),在包中
--声明一个全局的REF CURSOR类型,并在包体中实现存储过程。
CREATE OR REPLACE PACKAGE my_package AS
TYPE my_refcursor IS REF CURSOR;
PROCEDURE pro_ceshi001(p_cur OUT my_refcursor);
END my_package;
/
CREATE OR REPLACE PACKAGE BODY my_package AS
PROCEDURE pro_ceshi001(p_cur OUT my_refcursor) AS
BEGIN
OPEN p_cur FOR
SELECT jmydl,gyydl
FROM ceshi001;
END pro_ceshi001;
END my_package;
/
-- 方法二,如果不想使用包,也可以直接在存储过程中定义REF CURSOR类型的输出参数。
--创建一个带游标的存储过程,SYS_REFCURSOR这是Oracle提供的内置REF CURSOR类型
CREATE OR REPLACE PROCEDURE pro_ceshi001(p_cur OUT SYS_REFCURSOR) AS
BEGIN
OPEN p_cur FOR
SELECT jmydl,gyydl
FROM ceshi001;
END pro_ceshi001;
/
-------------------------------------------------------------------------
-- 将从游标中获取到数据打印出来
DECLARE
v_cur SYS_REFCURSOR;
v_jmydl USER_KUNKUN.ceshi001.jmydl%TYPE;
v_gyydl USER_KUNKUN.ceshi001.gyydl%TYPE;
BEGIN
USER_KUNKUN.pro_ceshi001(v_cur);
LOOP
FETCH v_cur INTO v_jmydl,v_gyydl;
EXIT WHEN v_cur%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('jmydl: ' || v_jmydl || ', gyydl: ' || v_gyydl);
END LOOP;
CLOSE v_cur;
END;
/
-- 将从游标中获取到数据存入另一张表
DECLARE
v_cur SYS_REFCURSOR;
v_jmydl USER_KUNKUN.ceshi001.jmydl%TYPE;
v_gyydl USER_KUNKUN.ceshi001.gyydl%TYPE;
BEGIN
USER_KUNKUN.pro_ceshi001(v_cur);
LOOP
FETCH v_cur INTO v_jmydl,v_gyydl;
EXIT WHEN v_cur%NOTFOUND;
insert into ceshi002 values(v_jmydl,v_gyydl) ;
END LOOP;
CLOSE v_cur;
END;
/
oracle中游标在存储过程中的简单使用
于 2025-01-23 11:46:15 首次发布