`
zhanghw0917
  • 浏览: 186037 次
  • 性别: 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

    oracle1存储过程+触发器.pdf

    。。oracle1存储过程+触发器.pdf

    用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