`
zhanghw0917
  • 浏览: 185689 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

oracle 存储过程 ( 例子+ 随笔)

    博客分类:
  • DB
阅读更多

最近写关于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 11g RAC+DG 的部署手册,涵盖了从准备工作到部署完成的所有...

    oracle存储过程+日期+定时任务Job

    ### Oracle 存储过程 + 日期 + 定时任务 Job #### 一、概述 在 Oracle 数据库中,存储过程是一种可编程的对象,用于执行特定的任务。存储过程可以在数据库服务器上运行,从而提高应用程序的性能并减少网络流量。...

    oracle存储过程例子

    这篇博文“Oracle存储过程例子”可能提供了关于如何创建、调用和使用Oracle存储过程的实际示例。 首先,存储过程可以提高应用性能,因为它将多次执行的SQL语句预编译并存储在数据库中。每次调用时,只需要执行已...

    oracle存储过程学习经典入门

    本文将从 Oracle 存储过程的基础知识开始,逐步深入到 Oracle 存储过程的高级应用,包括 Hibernate 调用 Oracle 存储过程和 Java 调用 Oracle 存储过程的方法。 Oracle 存储过程基础知识 Oracle 存储过程是 Oracle...

    oracle 存储过程例子

    oracle 存储过程例子 自己写的所有oracle 的if while for

    用callabledStatement调用oracle存储过程实用例子(IN OUT 传游标)

    Oracle 存储过程调用 CallabledStatement 实用例子(IN OUT 传游标) 一、Oracle 存储过程简介 Oracle 存储过程是一种可以在 Oracle 数据库中存储和执行的程序单元。存储过程可以由多种语言编写,例如 PL/SQL、...

    C#调用oracle储存过程例子

    6. **C#调用Oracle存储过程**:在C#中,我们可以使用Oracle Managed Data Access (ODP.NET)库来调用存储过程。首先,确保安装了Oracle的ODP.NET驱动,然后创建连接,执行存储过程: ```csharp using Oracle....

    springboot整合mybatis调用oracle存储过程

    本文将深入探讨如何在Spring Boot项目中整合MyBatis,实现调用Oracle存储过程并处理游标返回的数据。 首先,我们需要在Spring Boot项目中引入相关的依赖。在`pom.xml`文件中添加Oracle JDBC驱动(ojdbc66-oracle...

    oracle 存储过程语法例子

    总结,这个例子中展示了Oracle存储过程的基本结构,包括包的创建、过程的定义、游标的使用、条件判断、动态SQL以及异常处理。这些都是在Oracle数据库环境中编写高级逻辑和数据操作时不可或缺的技能。通过理解和实践...

    SSM+Oracle 存储过程例子

    本文将详细介绍如何在SSM项目中调用Oracle存储过程,这对于提升应用程序性能和简化复杂操作具有重要意义。 首先,让我们了解一下SSM框架。SSM是由Spring框架、SpringMVC和MyBatis三个组件组成的轻量级Java Web开发...

    oracle存储过程unwrap解密工具.zip

    Oracle存储过程unwrap解密工具主要用于处理Oracle数据库中的加密存储过程。在Oracle数据库系统中,为了保护敏感代码或数据,开发人员有时会选择对存储过程进行加密。然而,当需要查看、调试或恢复这些加密的存储过程...

    oracle存储过程解锁

    以下是对“oracle存储过程解锁”这一主题的深入解析。 ### 标题:“oracle存储过程解锁” #### 解析: 在Oracle数据库中,存储过程是一种预先编译并存储在数据库中的SQL代码块,用于执行复杂的业务逻辑或数据处理...

    oracle 存储过程导出excel

    oracle 存储过程导出excel oracle 存储过程导出excel oracle 存储过程导出excel oracle 存储过程导出excel oracle 存储过程导出excel

    Oracle存储过程返回结果集

    在Oracle存储过程中,`IN`参数用于传递数据到过程,`OUT`参数则允许过程向调用者返回数据。而`SYS_REFCURSOR`是Oracle提供的一种特殊类型,它允许存储过程动态地打开一个游标(即结果集)并将其作为`OUT`参数返回。 ...

    帆软报表Oracle存储过程解决storeParameter1参数试用插件

    总结起来,"帆软报表Oracle存储过程解决storeParameter1参数试用插件"主要是针对在调用无参数Oracle存储过程时出现的异常问题提供的一种解决方案。通过安装并配置这个插件,用户可以顺利地在帆软报表中调用不包含...

    ORACLE存储过程例子及语法说明

    Oracle存储过程是数据库管理系统中一组预编译的SQL语句,可以封装成一个函数,用于执行...文档“语法.doc”、“入门例子.doc”和“例子.doc”提供了更详细的说明和示例,对于深入理解和应用Oracle存储过程将大有裨益。

    Python使用cx_Oracle调用Oracle存储过程的方法示例

    本文实例讲述了Python使用cx_Oracle调用Oracle存储过程的方法。分享给大家供大家参考,具体如下: 这里主要测试在Python中通过cx_Oracle调用PL/SQL。 首先,在数据库端创建简单的存储过程。 create or replace ...

    Oracle+11g+从入门到精通.pdf part2

    第二个压缩包

Global site tag (gtag.js) - Google Analytics