文档章节

ORACLE 存储过程

Romanceling
 Romanceling
发布于 2017/07/13 23:52
字数 532
阅读 41
收藏 0
  • 语法
CREATE [OR REPLACE ] PROCEDURE [ schema. ] procedure_name
  [parameter_name [[IN] datatype][{:= | DEFAULT} expression]
     | {OUT | IN OUT} [NOCOPY] datatype
  ][,...]
{IS | AS}
BODY;

1.简单无参存储过程

CREATE PROCEDURE PRODUCT_UPDATE_PRC
AS
BEGIN
 UPDATE productinfo SET DESPERATION = '促销产品'
 WHERE productid IN
 (
   SELECT productid FROM
    (SELECT * FROM productinfo ORDER BY productprice ASC)
   WHERE ROWNUM < 4
 );
COMMIT;
END;

2.存储过程中使用游标

CREATE PROCEDURE product_cur_prc
AS
   cur_ctgy       productinfo.category%TYPE;                              
   cur_ctgyname   productinfo.categoryname%TYPE;  
   cur_prtinfo    productinfo%ROWTYPE
   
   CURSOR cur_category
   IS
   SELECT category FROM productinfo GROUP BY category;

BEGIN
  OPEN cur_category;
    LOOP
      FETCH cur_category INTO cur_ctgy;
      EXIT WHEN cur_category%NOYFOUND;
    
      SELECT productinfo.categoryname INTO cur_ctgyname
      FROM productinfo
      WHERE categroyid = cur_ctgy;   --根据产品类型编码得到产品类型名称
          IF SQL%FOUND THEN
             DBMS_OUTPUT.PUT_LINE('---');
          END IF;
    END LOOP;
 CLOSE cur_category;

END;

3.存储过程中使用DDL语句:利用EXECUTE IMMEDIATE语句,来执行DDL语句和动态SQL语句.

CREATE PROCEDURE product_temp_update_prc
AS

 pc_delestr VARCHAR2(50);                             --删除临时表记录语句
 pc_createstr VARCHAR2(500);                          --创建临时表
 pc_insrtstr VARCHAR2(10);                            --向临时表中插入数据
 tabext VARCHAR2(10);                                 --用于判断临时表是否存在的中间变量

 cur_ctgy productinfo.category%TYPE;
 cur_prtifo  productinfo%ROWTYPE;

 CURSOR cur_category                                  --产品表中的产品类型游标
 IS 
 SELECT category FROM productinfo GROUP BY CATEGORY;

 CURSOR cur_proinfo(ctgy varchar)                     --获取已有的产品类型中价格最低的数据
 IS
 SELECT * FROM
  (SELECT * FROM productinfo WHERE category = ctgy ORDER BY productprice ASC)
 WHERE ROWNUM <2;
 
BEGIN

 SELECT COUNT(1) INTO tabext                          --判断临时表是否存在,存在为1,否则为0
 FROM ALL_TABLES
 WHERE TABLE_NAME = 'PRODUCTINFO_TEM';

  pc_delestr:='DELETE FROM productinfo_tem';

  pc_createstr:='CREATE GLOBAL TEMPORARY TABLE productinfo_tem
  (
    pruductid VARCHAR2(10) not null,
    productname VARCHAR2(20),
    productprice NUMBER(8,2)
  ) on commit preserve rows';

  IF tabext = 0 THEN                                 --不存在临时表则创建一个
    EXECUTE IMMEDIATE pc_createstr;
    DBMS_OUTPUT.PUTLINE('创建临时表成功!')
  ELSE 
    EXECUTE IMMEDIATE pc_delestr;
    DBMS_OUTPUT.PUTLINE('删除记录完成!')
  END IF;

  OPEN cur_category;
  LOOP
    FETCH cur_category INTO cur_ctgy;
    EXIT WHEN cur_category%NOTFOUND;
       OPEN cur_proinfo(cur_ctgy);
           FETCH cur_proinfo INTO cur_prtifo;
           IF cur_proinfo%ROWFOUND THEN
              IF cur_prtifo.productprice <20 THEN     --产品价格低于20打印出来
                 DBMS_OUTPUT.PUTLINE('产品ID:' || cur_prtifo.productid);
              ELSE                                    --其他输入到临时表
                EXECUTE IMMEDIATE 'INSERT INTO PRODUCTINFO_TEM(
                   pruductid,
                   productname,
                   productprice
                )VALUES('''
                   ||cur_prtifo.pruductid
                   ||''','''
                   ||cur_prtifo.productname
                   ||''','''
                   ||cur_prtifo.productprice
                   ||''')';
              END IF;
           END IF;
      CLOSE cur_proinfo;
   END LOOP;
      COMMIT;
   CLOSE cur_category;
   EXECUTE IMMEDIATE 'UPDATE PRODUCTINFO_TEM SET DESPERATION = ''热销商品''';
END;

4.有参存储过程

CREATE PROCEDURE product_outtype_prc(parm_ctgyname IN VARCHAR2,parm_ctgyid OUT VARCHAR2)
AS
BEGIN
  SELECT categroyinfo.categroyid INTO parm_ctgyid
  FORM categroyinfo
  WHERE categroyinfo.categroyname = parm_ctgyname;
   IF SQL%FOUND THEN
      DBMS_OUTPUT.PUT_LINE('传出参数是:' || parm_ctgyid);
   END IF;
  EXCEPTION
  WHEN NO_DATA_FOUND THEN
   DBMS_OUTPUT.PUT_LINE('没有数据!');
  WHEN TOO_MANY_ROWS THEN
   DBMS_OUTPUT.PUT_LINE('数据过多!');
END product_outtype_prc;

 

© 著作权归作者所有

上一篇: CSS和文档
下一篇: ORACLE 异常处理
Romanceling
粉丝 14
博文 166
码字总数 91809
作品 0
无锡
程序员
私信 提问
Oracle存储过程创建及调用 java调用oracle存储过程的示例总结

在大型数据库系统中,有两个很重要作用的功能,那就是存储过程和触发器。在数据库系统中无论是存储过程还是触发器,都是通过SQL 语句和控制流程语句的集合来完成的。相对来说,数据库系统中的...

梅_95
2016/09/13
70
0
Winform开发框架之存储过程的支持--存储过程的实现和演化提炼(1)

在我前面很多篇关于框架设计和介绍的文章里面,大多数都是利用框架提供的基础性API进行各种的操作,包括增删改查、分页等各种实现和其衍生的实现,而这些实现绝大多数是基于SQL的标准操作实现...

walb呀
2017/12/04
0
0
Java程序员的日常——存储过程知识普及

存储过程是保存可以接受或返回用户提供参数的SQL语句集合。在日常的使用中,经常会遇到复杂的业务逻辑和对数据库的操作,使用存储过程可以进行封装。可以在数据库中定义子程序,然后把子程序...

青夜之衫
2017/12/05
0
0
Ruby通过OCI8操作Oracle存储BLOB

Oracle中BLOB是用来存储图片、文件等大数据对象的。 本文是一个Ruby读写Oracle的BLOB的例子,通过OCI8操作Oracle的存储过程 1、建表 CREATE TABLE "T_IMAGE" ("ID" NUMBER(11) GENERATED BY......

乾中
2016/04/26
128
0
Oracle cursor学习笔记

@[toc] 最近在看《基于oracle的sql优化》一书,并做了笔记 一、oracle库缓存 1.1、库缓存简介 介绍oracle cursor(游标)之前先,介绍一下oracle的库缓存,Oracle库缓存(Library Cache)是SGA中...

smileNicky
08/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

详解RPC远程调用和消息队列MQ的区别

什么是RPC RPC(Remote Procedure Call)远程过程调用,主要解决远程通信间的问题,不需要了解底层网络的通信机制。 RPC服务框架有哪些 知名度较高的有Thrift(FB的)、dubbo(阿里的) RPC的一般...

一只会编程的狼
29分钟前
5
0
Dubbo面试题

支持的调用方式 同步调用 异步调用 参数回调 事件通知 支持的注册中心 Dubbo线上支持三种注册中心:自带的Simple Registry、Redis和Zookeeper,当然,最常用的还是Zookeeper作为注册中心,因...

i不歪
36分钟前
5
0
idea打包jar发布到nexus

8.idea打包jar发布到nexus 1. 配置maven的nexus地址 打开maven配置文件:\apache-maven-X.X.X\conf\settings.xml 修改配置为: <localRepository>E:\maven</localRepository> <pluginGroup......

TopDuang
38分钟前
6
0
nvm 使用方式

nvm 使用方式 命令: nvm ls-remote:列出所有可以安装node 版本号 nvm install v10.4.0:安装指定版本号的node nvm use v10.3.0:切换node版本,这个是全局的 nvm current:当前nod...

潇潇程序缘
39分钟前
4
0
八爪鱼爬网页分页数据

一个yuanbeth
42分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部