一、存储过程定义
create or replace procedure P_TEST(beginDate DATE,
endData DATE) IS
--声明变量
CURSOR CUR_MDATA IS
SELECT A.*
FROM myTable A
WHERE A.TIME BETWEEN beginDate AND endData
ORDERBY A.TIME;
REC_MYDATA myTable%ROWTYPE; --本天开始的行记录
BIT_OIL_TYPE varchar2(10) := '';
ZJ_YXSC_MONTH_QINGNUMBER := 0;
BEGIN
--存储过程体
END P_TEST;
二、游标
1.直接声明游标
OPEN CUR_MDATA ;
LOOP
FETCH CUR_MDATA
INTO REC_MYDATA;
EXITWHEN CUR_D7II%NOTFOUND;
--循环中做的事情
END LOOP;
2.函数动态声明
CURSOR COUNT_DEPTIS_NULL(STARTTIME DATE,ENDTIME DATE) IS
SELECTCOUNT(*)
FROM DT711 A1
WHERE A1.TIME BETWEEN STARTTIME ANDENDTIME;
BEGIN
OPEN COUNT_IS_NULL('1', '10',BC_HANGCI_RECORD.STARTTIME,BC_HANGCI_RECORD.ENDTIME);
FETCH COUNT_IS_NULL
INTO P_COUNT_GL_Q;
CLOSE COUNT_IS_NULL;
End;
三、for循环
FOR REC_DT711_FOR_YHZB IN (SELECT *
FROM DT711) LOOP
--循环体通过 REC_DT711_FOR_YHZB.paramName 取值
End loop;
四、异常处理(是否还在用select count(*) 判断是否有数据,通过异常捕获会更简单一些)
1.当我们需要遍历某个表中的数据,或通过select into 给某个变量赋值时,下面这种情况会抛出no_data_found异常,以前我会用select count(pid) into countPerson进行前期判断,判断countPerson 是否大于0,这样不仅增加了代码的冗余,还是代码可读性变差。
2.通过下面处理让代码变得清爽:
Begin
--可能出现异常
for rec_person_id in(select pid from t_person)loop
--处理逻辑
end loop;
Exception when no_data_found then
--处理逻辑
DBMS.OUTPUT_PUTLINE("没有数据");
End;