oracle 在一个存储过程中调用另一个返回游标的存储过程

   2015-09-24 0
核心提示:实际项目当中经常需要在一个存储过程中调用另一个存储过程返回的游标,本文列举了两种情况讲述具体的操作方法。
第一种情况是返回的游标是某个具体的表或视图的数据,如:
SQL-Code:
复制代码 代码如下:

CREATE OR REPLACE PROCEDURE P_TESTA (
PRESULT OUT SYS_REFCURSOR
)
AS
BEGIN
OPEN PRESULT FOR SELECT * FROM USERS;
END P_TESTA;

其中USERS就是数据库中一个表。在调用的时候只要声明一个该表的ROWTYPE类型就可以了:
SQL-Code:
复制代码 代码如下:

CREATE OR REPLACE PROCEDURE P_TESTB
AS
VARCURSOR SYS_REFCURSOR;
R USERS%ROWTYPE;
BEGIN
P_TESTA(VARCURSOR);
LOOP
FETCH VARCURSOR INTO R;
EXIT WHEN VARCURSOR%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(R.NAME);
END LOOP;
END P_TESTB;

第二种情况,我们返回的不是表的所有的列,或许只是其中一列或两列,如:
SQL-Code:
复制代码 代码如下:

CREATE OR REPLACE PROCEDURE P_TESTA (
PRESULT OUT SYS_REFCURSOR
)
AS
BEGIN
OPEN PRESULT FOR SELECT ID,NAME FROM USERS;
END P_TESTA;

这里我们只返回了USERS表的ID,NAME这两个列,那么调用的时候也必须做相应的修改:
SQL-Code:
复制代码 代码如下:

CREATE OR REPLACE PROCEDURE P_TESTB
AS
VARCURSOR SYS_REFCURSOR;
CURSOR TMPCURSOR IS SELECT ID,NAME FROM USERS WHERE ROWNUM=1;
R TMPCURSOR%ROWTYPE;
BEGIN
P_TESTA(VARCURSOR);
LOOP
FETCH VARCURSOR INTO R;
EXIT WHEN VARCURSOR%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(R.ID);
END LOOP;
END P_TESTB;

与之前不同的是我们声明了一个游标类型的变量TMPCURSOR ,注意TMPCURSOR 的结构必须与存储过程P_TESTA 返回的游标结构一致,否则就会出现错误。同理只要保持两个游标类型结构一致,就可以实现自由调用。
 
标签: 存储过程 调用
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • Oracle 存储过程,临时表,动态SQL测试
    --创建事务级别的结果临时表create global temporary table tmp_yshy( c1 varchar2(100), c2 varchar2(100))on commit delete rows;--创建事务级别的存储sql语句的临时表create global temporary table tmp_sql( c1 varchar2(4000))on commit delete rows;测
    02-10
  • MYSQL和ORACLE的触发器与存储过程语法差异
    整改了一番脚本,遇到了一些两种数据库之间的差异,记录一下:触发器:差异MYSQLORACLE说明创建语句不同create trigger `AA` BEFORE INSERT on `BB` for each row create or replace trigger AA  before insert or update or delete on BB  for each ro
    02-10
  • MySQL存储过程实现动态执行SQL mysql 存储过程
    --存储过程名和参数,参数中in表示传入参数,out标示传出参数,inout表示传入传出参数create procedure p_procedurecode(in sumdate varchar(10)) begin declare v_sql varchar(500);--需要执行的SQL语句 declare sym varchar(6);declare var1 varchar(20); d
    02-10
  • SQL与oracle分页存储过程 sql实现oracle分页
    SQL分页存储过程///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////CREATE PROCEDURE [dbo].[sp_PageIndex]( -- Add the parameters for the stored procedure here @tblName varc
    02-10
  • sql Sever的存储过程转换为mysql的
    总体来说,sql sever和Mysql的存储过程的思路都是一样的,但是在语法和结构上还是有很大的区别的。1. 在mysql中写存储过程所有的dbo都要去掉。2. 每一个sql语句后面都需要加上;否则报错;4. 再说参数,在MSSQL中我们一般会这么定义参数1234CREATE PROCEDU
    02-10
  • oracle 存储过程使用动态sql
    Oracle存储过程使用动态SQL 有两种写法:用 DBMS_SQL 或 execute immediate,建议使用后者。DDL和DML (注意DDL中可以用拼接字符串的方法用来create table或drop table,在DML中,类似于insert则不可以直接用execute immediate中直接拼接的方法,必须用using
    02-10
  • oracle存储过程例子,包含函数,动态执行sql
     如下: 1 create or replace procedure JDGL_PRO_GET_DFLZJSBB3(p_date1 in varchar2, res OUT sys_refcursor) is2 3 strSql clob;4 5FUNCTION CONACT_SQL_JS(XFAJ0902 IN VARCHAR2,XFAJ0903 IN VARCHAR2) RETURN clob AS6BEGIN7 RETURN'8 SELECT9--合计省
    02-10
  • MySql带参数的存储过程编写(动态执行SQL语句)
     该存储过程是根据用户输入的条件和排序方式查询用户的信息,排序条件可以没有调用方式:call GetUsersDynamic('age=30','');/********动态查询用户的信息********/CREATE PROCEDURE GetUsersDynamic(WhereCondition varchar(500),OrderByExpress varchar(10
    02-10
  • ORACLE动态sql在存储过程中出现表或视图不存在
    Oracle动态sql在存储过程中出现表或视图不存在的解决方法  CREATE OR REPLACE PROCEDURE P_testisstrsql varchar2(2000);BEGIN     --导入用户数据数据                strsql := 'insert into tabuser (usercode) select us.tabuser.u
    02-09
  • Oracle 在函数或存储过程中执行sql查询字符串并
    请看黄色部分 IF CUR_MONTH_BILL_ID0 --区县指标 THENTVALUE_SQL :='SELECT TO_CHAR(' || CUR_ROW.MAIN_FIELD || ') FROM ' || CUR_ROW.END_TABLE || '_' || CUR_MONTH || ' WHERE TO_CHAR(DISTRICT_ID)=''' || CUR_ROW.E_DISTRICT_
    02-09
点击排行