上一节说函数

这回聊一下 存储过程:有了上节知识点,对这个也许会一种小感觉.呵呵

过程(存储过程):与过程相比, 存储过程是存在数据库中的一个对象

我主要通过例子来了解 不做多解释 相信你也能明白:

  eg1:  现在定义一个简单的过程,就是打印一个数字

      create or replace procedure myfun

       is

    i number;

begin

         i:=100;

          DBMS_OUTPUT.put_line('i = '||i) ;//打印一个数字
    

         end;

  /* 在想什么,会不会觉有点熟悉 ,怎么这么像function, 其实我也想 ,汗!!*/

执行格式: exec 过程名字

   eg: exec myfun;

下面 还是主要写几个例子,边看例子,便解释

    eg2:下面编写一个过程,要求,可以传入部门的编号,部门的名称,部门的位置,之后调用此
过程就可以完成部门的增加操作。

    CREATE OR REPLACE PROCEDURE myprocmyproc(dno dept.deptno%TYPE,name  dept.dname%TYPE,dl dept.loc%TYPE)
      AS
      cou NUMBER ;
    BEGIN
        SELECT COUNT(deptno) INTO cou FROM dept WHERE deptno=dno -- 判断插入的部门编号是否存在,如果存在则不能插入
    IF cou=0 THEN-- 可以增加新的部门
       INSERT INTO dept(deptno,dname,loc) VALUES(dno,name,dl) ;

         DBMS_OUTPUT.put_line('部门插入成功! ') ;
    ELSE
       DBMS_OUTPUT.put_line('部门已存在,无法插入! ') ;
    END IF ;
  END ;
/

. 删除 mypro 存储过程
    drop procedure myproc;

______________________________________________________________________________________--

过程的参数类型:
• IN:值传递,默认的
• IN OUT:带值进,带值出
• OUT:不带值进,带值出

   eg: IN:值传递,默认的不说了

 eg1 :IN OUT 类型:
    CREATE OR REPLACE PROCEDURE myproc(dno IN OUT dept.deptno%TYPE,name  dept.dname%TYPE,dl dept.loc%TYPE)
    AS
      cou NUMBER ;
    BEGIN
      -- 判断插入的部门编号是否存在,如果存在则不能插入
      SELECT COUNT(deptno) INTO cou FROM dept WHERE deptno=dno ;
    IF cou=0 THEN
      -- 可以增加新的部门
      INSERT INTO dept(deptno,dname,loc) VALUES(dno,name,dl) ;
      DBMS_OUTPUT.put_line('部门插入成功! ') ;
     -- 修改 dno 的值
      dno := 1 ;
    ELSE
        DBMS_OUTPUT.put_line('部门已存在,无法插入! ') ;
      dno := -1 ;
    END IF ;
    END ;

  编写 PL/SQL 块验证过程:
        DECLARE
          deptno dept.deptno%TYPE ;
        BEGIN
          deptno := 12 ;
          myproc(deptno,'开发','南京') ;
          DBMS_OUTPUT.put_line(deptno) ;
        END ;
/
  eg2  :OUT 类型:
         不带任何值进,只把值带出来。

      CREATE OR REPLACE PROCEDURE myproc(dno OUT dept.deptno%TYPE)
       AS
          I number
      BEGIN
        I:= dno;
      END ;
/
      执行上面的存储过程
       DECLARE
        deptno dept.deptno%TYPE ;
      BEGIN
        deptno :=12
        myproc(deptno) ;
        DBMS_OUTPUT.put_line(deptno) ;
      END ;
/
——————————————————————————————————————————————————————
下面编写一个存储过程,要求,可以传入部门的编号,部门的名称,部门的位置,之后调
用此过程就可以完成部门的增加操作。
create or replace procedure myproc(dno dept.deptno%type,
dn dept.dname%type,dl dept.loc%type)
as
cou number;
begin
select count(*) into cou from dept where deptno = dno;
if cou=0 then
insert into dept values (dno,dn,dl);
dbms_output.put_line('增加部门成功');
else
dbms_output.put_line('部门已存在');
end if;
end;
/

1. 创建三张表 dept10,dept20,dept30,表结构和 dept 一致(不拷贝数据)
create table dept10 as select * from dept where 1=2;
create table dept20 as select * from dept where 1=2;
create table dept30 as select * from dept where 1=2;
2. 编写一个存储过程 mypro,
i. 把 dept 表中 depto=10 的数据,存到 dept10,
ii. 把 dept 表中 depto=20 的数据,存到 dept20
iii. 把 dept 表中 depto=30 的数据,存到 dept30
iv. 执行该存储过程
 create or replace procedure myproc
as
begin
insert into dept10 select * from dept where deptno=10;
insert into dept20 select * from dept where deptno=20;
insert into dept30 select * from dept where deptno=30;
end;
/
create or replace procedure mypro
as
cursor mycur is select * from dept;
empInfo emp%ROWTYPE ;
begin
for empInfo in mycur loop
if empInfo.deptno = 10 then
insert into dept10 values(empInfo.deptno, empInfo.dname, empInfo.loc);
elsif empInfo.deptno = 20 then
insert into dept20 values(empInfo.deptno, empInfo.dname, empInfo.loc);
elsif empInfo.deptno = 30 then
insert into dept30 values(empInfo.deptno, empInfo.dname, empInfo.loc);
end if;
end loop;
end;
exec myproc;

4. 写一个存储过程 (给一个用户名,判断该用户名是否存在)
create or replace procedure findName(name emp.ename%type,en out number)
as i number;
begin
select count(*) into i from emp where ename=name;
if i=1 then
en:=i;
dbms_output.put_line('用户存在');
else
en:=0;
dbms_output.put_line('用户不存在');
end if;
end;
/
5. 执行该存储过程
DECLARE
deptno dept.deptno%TYPE ;
BEGIN
findName(upper('aaa'),deptno) ;
DBMS_OUTPUT.put_line(deptno) ;
END ;
/
6.编写一个存储过程,批量插入 1000 条数据(只插入
create table test(i number(10));
create or replace procedure add1
as
i number(10);
begin
for i in 1..1000 loop
if mod(i,2) = 1 then
insert into test values(i);
end if;
end loop;
end;

  

               

  

  

Oracle中Function学习2的更多相关文章

  1. Oracle中的学习笔记

    1.使用 ||来连接字符串 select CARD_ID ||','||CARD_TYPE as qqq from CARDS t 2.DISTINCT (唯一不重复) select DISTINCT ...

  2. oracle function学习1

    oracle function学习基层: 函数就是一个有返回值的过程.  首先 知道oracle 使用限制:      函数调用限制: 1. SQL语句中只能调用存储函数(服务器端),而不能调用客户端 ...

  3. Oracle中存储过程传入表名学习

    Oracle中存储过程传入表名: 一.动态清除该表的数据 create or replace procedure p_deletetable(i_tableName in varchar2)  as  ...

  4. oracle中的存储过程例子

    用了两年Oracle还没写过存储过程,真是十分惭愧,从今天开始学习Oracle存储过程,完全零起点,争取每日一篇学习笔记,可能开始认识的不全面甚至有错误,但坚持下来一定会有收获. . 建立一个存储过程 ...

  5. Oracle中的二进制、八进制、十进制、十六进制相互转换函数

    原文:Oracle中的二进制.八进制.十进制.十六进制相互转换函数 Oracle中的二进制.八进制.十进制.十六进制相互转换函数   今天在网上看到一篇关于在oracle中对各种进制数进行转换的帖子, ...

  6. Oracle中如何导出存储过程、函数、包和触发器的定义语句?如何导出表的结构?如何导出索引的创建语句?

    Oracle中如何导出存储过程.函数.包和触发器的定义语句?如何导出表的结构?如何导出索引的创建语句? QQ群里有人问:如何导出一个用户下的存储过程?   麦苗答:方法有多种,可以使用DBMS_MET ...

  7. Oracle中删除用户下所有对象的多种方法

      Oracle删除用户下所有对象的方法未必人人都会,下面就为您介绍两种常用的Oracle删除用户下所有对象的方法,希望对您学习Oracle删除用户方面能有所帮助. 方法1: drop user XX ...

  8. ORACLE中的LTRIM、RTRIM和TRIM

    LTRIM.RTRIM和TRIM在ORACLE中的用法:1.LTRIM(C1,C2)其中C1和C2都可以字符串,例如C1是'Miss Liu',C2'MisL'等等.这是第一个和SQL SERVER不 ...

  9. Oracle中使用REGEXP_SUBSTR,regexp_replace函数

    REGEXP_SUBSTR函数格式如下: function REGEXP_SUBSTR(String, pattern, position, occurrence, modifier)__srcstr ...

随机推荐

  1. js 移动端点击复制字符串

    function copyStr(val) { //val 是要复制的字符串 var input = document.createElement("input"); input. ...

  2. C# StructLayout(LayoutKind.Sequential)]

      结构体是由若干成员组成的.布局有两种1.Sequential,顺序布局,比如struct S1{ int a; int b;}那么默认情况下在内存里是先排a,再排b也就是如果能取到a的地址,和b的 ...

  3. 深入理解JVM(一)类加载器部分:双亲委派模型

    类加载器的父亲委托机制 在父亲委托机制中,各个类加载器按照父子关系形成了树形结构,除了根类加载器之外,其余的类加载器都有且只有一个父加载器. 先让最顶层可以加在的父加载器加栽(所有可加载的加载器中,处 ...

  4. myeclipse14 破解教程

        myeclipse14 破解教程     注意:先不要打开myeclipse,破解完成之后再打开    Myeclipse-2014-GA-破解文件  链接: https://pan.baid ...

  5. python 描述器

    语法简析 一般来说,描述器(descriptor)是一个有”绑定行为”的对象属性(object attribute),它的属性访问被描述器协议方法重写.这些方法是 __get__(). __set__ ...

  6. php 7.2下mcrypt扩展支持附带的问题

    按照网上提供的mcrypt扩展编译支持方法,完成了扩展编译,也确实可以正常加密/解密了 但是如果php.ini中配置为: error_reporting = E_ALL display_errors ...

  7. yii2下使用支付宝

    最近入坑了yii2 感觉是个很强大的框架.使用yii做支付宝的移动支付的时候出了点问题,记录下来避免以后忘记了. 使用的是支付宝立即到账的功能,网上很多集成好的接口我就不重复了,找不到的话github ...

  8. GitHub的使用问题记录

    1. github如何收藏和关注? github 中的star作用:star 的作用是收藏,目的是方便以后查找. watch 的作用是关注,目的是等作者更新的时候,你可以收到通知.fork 的作用是参 ...

  9. 抓取摩拜单车API数据,并做可视化分析

    抓取摩拜单车API数据,并做可视化分析 纵聊天下 百家号|04-19 15:16 关注 警告:此篇文章仅作为学习研究参考用途,请不要用于非法目的. 摩拜是最早进入成都的共享单车,每天我从地铁站下来的时 ...

  10. 深入浅出 Java Concurrency (11): 锁机制 part 6 CyclicBarrier[转]

    如果说CountDownLatch是一次性的,那么CyclicBarrier正好可以循环使用.它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point).所谓屏障点就 ...