最近写关于oracle 存储过程的代码,以前没有接触过,就把这几天写的代码贴出来:
使用工具PL/SQL Developer
1.创建
在已有的数据库中写的代码,
在Procedures文件夹中右键-->new
输入存储过程的名字,一般以P开头(代码习惯而已),然后输入参数,当然参数在文件里面写也可以;
2.编写sql语句
代码如下://这段代码是可以运行的,已经测过
没有参数的:
/*
author by zhanghw
200906
*/
CREATE OR REPLACE PROCEDURE P_temp_t1 AS
city_name varchar2(50);
dbname varchar2(20);
sqlstr1 varchar2(5000);
sqlstr2 varchar2(5000);
--sqlstr3 varchar2(5000);
p_starttime varchar2(30);--月开始时间
p_endtime varchar2(30);--月结束时间
mon varchar2(30);
t_type varchar(1);
xxbig varchar2(100);
xxdl_name varchar2(400);
xxxl_name varchar2(120);
total number(10) ;
TYPE t_cursor IS REF CURSOR; --游标
cur_city t_cursor;
cur_count t_cursor;
BEGIN
mon :=to_char(add_months(to_date(to_char(sysdate,'yyyyMM'),'yyyyMM'),-1),'yyyyMM');--获取要查询的月
p_endtime :=to_char(last_day(to_date(to_char(sysdate,'yyyyMM'),'yyyyMM')),'yyyyMMDD')||'23:59:59';--月的最后时间
p_starttime :=mon||'01 00:00:00';--月的最后时间
/*获取城市及db名称*/
sqlstr1 :='SELECT city, dbname FROM re_complain_ini ORDER BY id' ;
OPEN cur_city FOR sqlstr1 ; --循环城市,最外层循环
LOOP
FETCH cur_city INTO city_name , dbname ;
EXIT WHEN cur_city%NOTFOUND ;
BEGIN
FOR num IN 0..3 LOOP --循环类型 0咨询 1 投诉 2 ……3 ……
t_type := to_char(num);
sqlstr2 := 'select b.xxbig,b.name,c.name,count(1) from complain_info2@' || dbname || ' a,km_situation_list@' || dbname ||' b,km_minitype_small@' || dbname ||' c where a.accept_date between to_date(' || '''' ||p_starttime || '''' || ',' || '''' || 'yyyy-MM-DD HH24:MI:SS' || '''' || ') and to_date(' || '''' || p_endtime || '''' || ',' || '''' ||'yyyy-MM-DD HH24:MI:SS' || '''' || ') and a.situation=b.id and a.sub_situation=c.id and a.task_type='||t_type|| 'group by b.xxbig,b.name,c.name';
-- DBMS_OUTPUT.put_line(sqlstr2);
OPEN cur_count FOR sqlstr2 ;--遍历查询的结果
LOOP
FETCH cur_count INTO xxbig,xxdl_name,xxxl_name,total ;
EXIT WHEN cur_count%NOTFOUND ;
BEGIN
/*将上面查询的结果存入COMPLAIN_INFO_TEMP表中*/
insert into INFO_TEMP values(xxbig,xxdl_name,xxxl_name,total,city_name,t_type,mon,'','',seq_id.nextval);
COMMIT ;
END ;
END LOOP ;
CLOSE cur_count ;
END LOOP;
END ;
END LOOP ;
COMMIT ;
CLOSE cur_city ;
END P_temp_t1;
有输入参数有返回值的:
create or replace procedure p_info
(
starttime in varchar
endtime in varchar,-- end time
p_city in varchar,-- city ‘’所有
type in varchar
result out varchar-- result;
)
IS
city varchar2(20);
c_city varchar2(20);
end_time_key varchar2(50);
ERR_MSG varchar2(30);
amt number;
l_count number;
dbname varchar2(50);
start_time varchar2(50);
end_time varchar2(50);
t_str varchar2(3000);
sqlstr1 varchar2(3000);
sqlstr varchar2(3000);
v_count number;
……
3.编译或者叫做compile
点击左上角“Execute” 或者“F8”
在下方会告诉你语法是否有问题
4.测试
在存储过程的文件名上右击-->test
会自动生成测试文件,而且还带有debug功能
代码如下:
begin
-- Call the procedure
p_complain_info_temp_t1;
end;
附:
对于在存储过程中使用sql语句:
1. 直接书写
insert into INFO_TEMP values(xxbig,xxdl_name,xxxl_name,total,city_name,t_type,mon,'','',seq_id.nextval);
COMMIT ;
2. 使用变量
sqlstr1 :='SELECT city, dbname FROM re_complain_ini ORDER BY id' ;
execute immediate sqlstr1;
调用函数给变量赋值:
1.直接使用
mon :=to_char(add_months(to_date(to_char(sysdate,'yyyyMM'),'yyyyMM'),-1),'yyyyMM');--获取要查询的月
p_endtime :=to_char(last_day(to_date(to_char(sysdate,'yyyyMM'),'yyyyMM')),'yyyyMMDD')||'23:59:59';--月的最后时间
p_starttime :=mon||'01 00:00:00';--月的最后时间
说明: a.变量要在前面声明
b. to_char()将其他类型强制转换为varchar2型,并可以为时间设置格式,to_date()将字符解析为时间类型,输入字符的长度要和格式长度一样,否则报错,last_day()获取上个月的最后一天,可以带有时间的
c.sysdate 是获取当前系统时间
2.使用select
select to_char(SYSDATE-1/24*30/60,'yyyymmddhh24mi') into STAND_TIMEKEY from dual;
说明:
into 是关键字 赋值 , from dual 也不能省略
注意:
1 赋值和其他操作 要放到begin中去做
2 begin中不能有declare
3 begin end , loop end loop ,if end if 一定要相对应
4 '' 两个单引号表示一个 单引号,
|| 是字符连接
关于遍历结果集的问题
可以使用游标
1.一种这样使用
sqlstr1 varchar2(5000);
TYPE t_cursor IS REF CURSOR; --游标
cur_city t_cursor;
cur_count t_cursor;
BEGIN
/*获取城市及db名称*/
sqlstr1 :='SELECT city, dbname FROM re_complain_ini ORDER BY id' ;
OPEN cur_city FOR sqlstr1 ; --打开游标
LOOP
FETCH cur_city INTO city_name , dbname ;
EXIT WHEN cur_city%NOTFOUND ; --退出条件
BEGIN
NULL;
END;
END LOOP;
END ;
2.另一种 类似如下
来自http://blog.csdn.net/ronk/archive/2006/11/08/1374272.aspx的代码:
BEGIN
DECLARE
val INTEGER; --保存"上一次游标取出的userid"
cur INTEGER; --保存"当前游标取出的userid"
CURSOR nextRecodeRow IS
SELECT * FROM v_process_attr3 WHERE dm=dm_input ORDER BY dm,userid,process_num;
--用%ROWTYPE属性声名的记录变量自动拥有对应于所引用镖的字段的字段名
RecodeRow_v_process_attr v_process_attr3%ROWTYPE;
BEGIN
val := 0;
DELETE FROM attr_list;
COMMIT;
FOR RecodeRow_v_process_attr IN nextRecodeRow LOOP
cur := RecodeRow_v_process_attr.userid;
CASE val
WHEN cur THEN
BEGIN
val := cur;
UPDATE attr_list
SET
attr_list.attr_list = attr_list.attr_list || ',' || RecodeRow_v_process_attr.attribute_code || '=' ||RecodeRow_v_process_attr.attribute_value
WHERE
attr_list.userid = val
and
RecodeRow_v_process_attr.dm=dm_input;
COMMIT;
END;
ELSE
BEGIN
val := cur;
INSERT INTO attr_list
VALUES
( dm_input,
RecodeRow_v_process_attr.userid ,
RecodeRow_v_process_attr.process_num,
RecodeRow_v_process_attr.attribute_code || '=' || RecodeRow_v_process_attr.attribute_value,
RecodeRow_v_process_attr.timeout );
COMMIT;
END;
END CASE;
END LOOP;
END;
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ronk/archive/2006/11/08/1374272.aspx
分享到:
相关推荐
Oracle 11g RAC+DG 非常牛逼的部署手册 Oracle 11g RAC+DG 是一种高可用性的数据库解决方案,它可以提供高性能和高可用性的数据库服务。下面是 Oracle 11g RAC+DG 的部署手册,涵盖了从准备工作到部署完成的所有...
### Oracle 存储过程 + 日期 + 定时任务 Job #### 一、概述 在 Oracle 数据库中,存储过程是一种可编程的对象,用于执行特定的任务。存储过程可以在数据库服务器上运行,从而提高应用程序的性能并减少网络流量。...
这篇博文“Oracle存储过程例子”可能提供了关于如何创建、调用和使用Oracle存储过程的实际示例。 首先,存储过程可以提高应用性能,因为它将多次执行的SQL语句预编译并存储在数据库中。每次调用时,只需要执行已...
本文将从 Oracle 存储过程的基础知识开始,逐步深入到 Oracle 存储过程的高级应用,包括 Hibernate 调用 Oracle 存储过程和 Java 调用 Oracle 存储过程的方法。 Oracle 存储过程基础知识 Oracle 存储过程是 Oracle...
oracle 存储过程例子 自己写的所有oracle 的if while for
。。oracle1存储过程+触发器.pdf
Oracle 存储过程调用 CallabledStatement 实用例子(IN OUT 传游标) 一、Oracle 存储过程简介 Oracle 存储过程是一种可以在 Oracle 数据库中存储和执行的程序单元。存储过程可以由多种语言编写,例如 PL/SQL、...
6. **C#调用Oracle存储过程**:在C#中,我们可以使用Oracle Managed Data Access (ODP.NET)库来调用存储过程。首先,确保安装了Oracle的ODP.NET驱动,然后创建连接,执行存储过程: ```csharp using Oracle....
本文将深入探讨如何在Spring Boot项目中整合MyBatis,实现调用Oracle存储过程并处理游标返回的数据。 首先,我们需要在Spring Boot项目中引入相关的依赖。在`pom.xml`文件中添加Oracle JDBC驱动(ojdbc66-oracle...
总结,这个例子中展示了Oracle存储过程的基本结构,包括包的创建、过程的定义、游标的使用、条件判断、动态SQL以及异常处理。这些都是在Oracle数据库环境中编写高级逻辑和数据操作时不可或缺的技能。通过理解和实践...
本文将详细介绍如何在SSM项目中调用Oracle存储过程,这对于提升应用程序性能和简化复杂操作具有重要意义。 首先,让我们了解一下SSM框架。SSM是由Spring框架、SpringMVC和MyBatis三个组件组成的轻量级Java Web开发...
Oracle存储过程unwrap解密工具主要用于处理Oracle数据库中的加密存储过程。在Oracle数据库系统中,为了保护敏感代码或数据,开发人员有时会选择对存储过程进行加密。然而,当需要查看、调试或恢复这些加密的存储过程...
以下是对“oracle存储过程解锁”这一主题的深入解析。 ### 标题:“oracle存储过程解锁” #### 解析: 在Oracle数据库中,存储过程是一种预先编译并存储在数据库中的SQL代码块,用于执行复杂的业务逻辑或数据处理...
oracle 存储过程导出excel oracle 存储过程导出excel oracle 存储过程导出excel oracle 存储过程导出excel oracle 存储过程导出excel
在Oracle存储过程中,`IN`参数用于传递数据到过程,`OUT`参数则允许过程向调用者返回数据。而`SYS_REFCURSOR`是Oracle提供的一种特殊类型,它允许存储过程动态地打开一个游标(即结果集)并将其作为`OUT`参数返回。 ...
总结起来,"帆软报表Oracle存储过程解决storeParameter1参数试用插件"主要是针对在调用无参数Oracle存储过程时出现的异常问题提供的一种解决方案。通过安装并配置这个插件,用户可以顺利地在帆软报表中调用不包含...
Oracle存储过程是数据库管理系统中一组预编译的SQL语句,可以封装成一个函数,用于执行...文档“语法.doc”、“入门例子.doc”和“例子.doc”提供了更详细的说明和示例,对于深入理解和应用Oracle存储过程将大有裨益。
本文实例讲述了Python使用cx_Oracle调用Oracle存储过程的方法。分享给大家供大家参考,具体如下: 这里主要测试在Python中通过cx_Oracle调用PL/SQL。 首先,在数据库端创建简单的存储过程。 create or replace ...
第二个压缩包