存储过程的基本语法如下:
create or replace procedure procedure_name
as
begin
extention;
end;
在sqlplus中调用存储过程的方式:
begin
procedure_name;
end;
我的业务需求是:查询自2015年1月1号以来的,每天的总订单量(截止到当天的所有订单),我需要接收一个时间,使订单时间小于等于该时间,然后对订单数计数,大概就是这样;
这是一个需要运行的存储过程:
CREATE OR REPLACEprocedure "RECYCLE_EVERY_DAY"ISbegindeclare --定义一个游标变量 ,将参数集合存进游标中 cursor every_day_list is SELECT TO_DATE( ‘2015-01-01‘, ‘yyyy-MM-dd‘ ) + ROWNUM - 1 AS daylistFROM DUAL CONNECT BY ROWNUM <= trunc( SYSDATE - to_date( ‘2015-01-01‘, ‘yyyy-MM-dd‘ )) + 1 ;--这个SQL是求出2015年1月1号至今为止的每一天的一个时间结果集
begin--循环游标,取出游标中的每一个值,然后将值传入到你需要的地方,比如另外一个存储过程 for item in every_day_list LOOP -- DBMS_OUTPUT.PUT_LINE(item.daylist); --打印出游标中的每一项 ADD_DATE_TEST(item.daylist);--ADD_DATE_TEST(item.daylist)是我的另外一个存储过程 end loop;end; end RECYCLE_EVERY_DAY;
下面是我的需要参数的存储过程:
CREATE OR REPLACEPROCEDURE "ADD_DATE_TEST"(VS_DATE IN DATE) ISBEGIN DECLARE cursor ORDER_TYPE_LIST is --声明游标,将查询结果集存入游标SELECT DISTINCTto_char( VS_DATE, ‘yyyy‘ ) AS year,CUSTOMER_TYPE,COUNT(*) AS ORDER_NUMS,SUM(COUNT(*)) over() AS ALL_ORDERSFROMT_ORDER_LIST WHERETO_CHAR(join_time,‘yyyy-MM-dd‘) <= TO_CHAR(VS_DATE,‘yyyy-MM-dd‘)GROUP BY to_char( VS_DATE, ‘yyyy‘ ), CUSTOMER_TYPE ;
beginFOR Itme in ORDER_TYPE_LIST LOOP --循环取出插入到相应的表 insert into ZT_FWDX_TB_NUMTONGBI_XRD (ID,YEAR,CUSTOMER_TYPE,ORDER_NUMS,SUM_NUM,CREATE_TIME,IS_HISTORY,DATE_MONTH,DATE_DAY) values (SEQ_ZT_FWDX_NUMTONGBI_XRD.Nextval,Itme.year,Itme.KEHU_TYPE,Itme.ORDER_NUMS,Itme.ALL_ORDERS,VS_DATE,0,TO_CHAR(VS_DATE,‘MM‘),TO_CHAR(VS_DATE,‘dd‘));end loop;/*dbms_output.put_line(VS_DATE);*/--可以先试着打印出传入的参数,看是否是需要的参数 end;COMMIT;--提交事务END ADD_DATE_TEST;
里面的表和字段,可以换成自己需要的,忽略我自己的表信息;
希望对你有帮助,有问题留言讨论!
Oracle 存储过程--游标循环
标签:run 结果 values -- sum bsp type group by 帮助
小编还为您整理了以下内容,可能对您也有帮助:
Oracle存储过程游标for循环怎么写
首先编写存储过程的整体结构,如下:
create or replace procere test_proc is
v_date date; --变量定义
begin
select sysdate into v_date from al;
end test_proc;
2.定义游标:
create or replace procere test_proc is
v_date date; --定义变量
cursor cur is select * from ldcode; --定义游标
begin
select sysdate into v_date from al;
end test_proc;
3.编写for循环:
create or replace procere test_proc is
v_date date; --定义变量
cursor cur is select * from ldcode where rownum<10; --定义游标
begin
select sysdate into v_date from al;
--游标for循环开始
for temp in cur loop --temp为临时变量名,自己任意起
Dbms_Output.put_line(temp.Code); --输出某个字段,使用"变量名.列名"即可。
end loop;
--游标for循环结束
end test_proc;
4.测试运行,点击【DBMS Output】标签页查看结果如下图:
END
二、带参数的游标for循环
1.定义带参数的游标:
cursor cur(v_codetype ldcode.Codetype%TYPE) is
select * from ldcode where codetype = v_codetype; --定义游标
定义游标格式:
cursor 游标名称(变量定义) is 查询语句;
注意:
where条件中的变量名v_codetype要与游标定义cur(v_codetype ldcode.Codetype%TYPE)中的一致。
2.编写for循环部分:
--游标for循环开始
for temp in cur('llmedfeetype') loop
--temp为临时变量名,自己任意起
--cur('llmedfeetype')为"游标名称(传入的变量)"
Dbms_Output.put_line(temp.Code); --输出某个字段,使用"变量名.列名"即可。
end loop;
--游标for循环结束
3.测试运行,点击【DBMS Output】标签页查看结果如下图:
oracle存储过程怎么写循环
写循环的操作方法和步骤如下:
1、第一步,编写存储过程的整体结构,然后定义变量,见下图。
2、其次,完成上述步骤后,在定义变量后定义游标,begin,select sysdate into v_date from al,end test_proc,如下图所示。
3、接着,完成上述步骤后,写一个for循环,游标开始for循环,为临时变量名任意起个名,输出一个字段,使用变量名.列名就好了,最后游标for循环就结束了,如下图所示。
4、最后,完成上述步骤后,试运行,单击“
DBMS Output”选项卡进行检查,运行成功,见下图。这样,问题就解决了。
oracle11g存储过程循环游标的区别
游标(Cursor)是处理数据的一种方法,为了查看或者处理结果集中的数据,游标提供了在结果集中一次一行或者多行前进或向后浏览数据的能力。
中文名
游标
外文名
Cursor
步骤1
游标定义
步骤2
打开游标
步骤3
提取游标
快速
导航
定义概念种类使用游标
基本信息
把游标当作一个指针,它可以指定结果中的任何位置,然后允许用户对指定位置的数据进行处理。
定义概念
主语言是面向记录的,一组主变量一次只能存放一条记录,仅使用主变量并不能完全满足SQL语句向应用程序输出数据的要求。即从某一结果集中逐一地读取一条记录。那么如何解决这种问题呢?游标为我们提供了一种极为优秀的解决方案。
游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。游标可以被看作是一个查询结果集(可以是零条、一条或由相关的选择语句检索出的多条记录)和结果集中指向特定记录的游标位置组成的一个临时文件,提供了在查询结果集中向前或向后浏览数据、处理结果集中数据的能力。有了游标,用户就可以访问结果集中任意一行数据,在将游标放置到某行之后,可以在该行或从该位置的行块上执行操作。
当决定对结果集进行处理时,必须声明一个指向该结果集的游标。如果曾经用C 语言写过对文件进行处理的程序,那么游标就像您打开文件所得到的文件句柄一样,只要文件打开成功,该文件句柄就可代表该文件。对于游标而言,其道理是相同的。可见游标能够实现按与传统程序读取平面文件类似的方式处理来自基础表的结果集,从而把表中数据以平面文件的形式呈现给程序。
关系数据库管理系统实质是面向集合的,在MS SQL SERVER 中并没有一种描述表中单一记录的表达形式,除非使用where 子句来*只有一条记录被选中。因此我们必须借助于游标来进行面向单条记录的数据处理。
oracle11g存储过程循环游标的区别
游标(Cursor)是处理数据的一种方法,为了查看或者处理结果集中的数据,游标提供了在结果集中一次一行或者多行前进或向后浏览数据的能力。
中文名
游标
外文名
Cursor
步骤1
游标定义
步骤2
打开游标
步骤3
提取游标
快速
导航
定义概念种类使用游标
基本信息
把游标当作一个指针,它可以指定结果中的任何位置,然后允许用户对指定位置的数据进行处理。
定义概念
主语言是面向记录的,一组主变量一次只能存放一条记录,仅使用主变量并不能完全满足SQL语句向应用程序输出数据的要求。即从某一结果集中逐一地读取一条记录。那么如何解决这种问题呢?游标为我们提供了一种极为优秀的解决方案。
游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。游标可以被看作是一个查询结果集(可以是零条、一条或由相关的选择语句检索出的多条记录)和结果集中指向特定记录的游标位置组成的一个临时文件,提供了在查询结果集中向前或向后浏览数据、处理结果集中数据的能力。有了游标,用户就可以访问结果集中任意一行数据,在将游标放置到某行之后,可以在该行或从该位置的行块上执行操作。
当决定对结果集进行处理时,必须声明一个指向该结果集的游标。如果曾经用C 语言写过对文件进行处理的程序,那么游标就像您打开文件所得到的文件句柄一样,只要文件打开成功,该文件句柄就可代表该文件。对于游标而言,其道理是相同的。可见游标能够实现按与传统程序读取平面文件类似的方式处理来自基础表的结果集,从而把表中数据以平面文件的形式呈现给程序。
关系数据库管理系统实质是面向集合的,在MS SQL SERVER 中并没有一种描述表中单一记录的表达形式,除非使用where 子句来*只有一条记录被选中。因此我们必须借助于游标来进行面向单条记录的数据处理。
oracle 定义存储过程的时候,能不能循环定义多个游标?
oracle没有游标数组的概念。但是你可以定义动态游标,举个例子:
declare
bm number;
zw varchar2(10);
tt number;
str varchar2(50);
type cur_type is ref cursor; --定义游标类型
cur cur_type; --定义游标变量
begin
str := 'select deptno,sum(sal) from emp group by deptno'; --查询字符串
open cur for str;
dbms_output.put_line('每个部门的工资总和:');
while cur%found loop
dbms_output.put_line(bm||' '||tt);
fetch cur into bm,tt;
end loop;
str:= 'select job,avg(sal) from emp group by job'; --查询字符串
open cur for str;
dbms_output.put_line('每个职位的工资总和:');
fetch cur into zw,tt;
while cur%found loop
dbms_output.put_line(zw||' '||tt);
fetch cur into zw,tt;
end loop;
end;
每次通过改变str的值,来改变select语句,从而改变游标。
至于循环游标就是这样:
open cur for str; --打开游标
dbms_output.put_line('每个职位的工资总和:');
fetch cur into zw,tt;
while cur%found loop -- 循环
dbms_output.put_line(zw||' '||tt);
fetch cur into zw,tt;
end loop;--循环结束
oracle数据库的存储过程中可以用到隐形游标。但是我不太明白为什么可以用 for in loop来完成对数据的处理。
这是游标的for循环。用游标的for循环,可以简化游标的操作步骤。使用时系统隐式地定义了一个游标名%ROWTYPE类型的记录变量,作为循环的计数器。使用游标的for循环,必须按正常方式先定义游标,然后在块的主体内使用for循环代替显示第打开游标和关闭游标。循环自动地处理查询返回的所有行。当最后一行被取出后,循环会自动终止。它会自动完成下列三步:
1.打开游标
2.取数据
3.关闭游标