• 激动,新手第一次小试oracle的存储过程


    之前一直写触发器,期间一直接触和听说了存储过程,好多天过去了,今天才第一次使用了存储过程。

    一,问题提出:http://zhidao.baidu.com/question/113921713.html

    求一个oracle程序块,循环插入A表一百行数据.

    就是定义一个变量,然后让人他循环一百次,往数据库里插入数据.
    插入的行只有一列是不一样的,就是这个变量,其它一样.请问如何写.
    表结构就二列.一个是放这个变量 a列,一个是名称列.
     create table A
    (
     a numeric,
      b varchar2(50)
    )
    有会的请赐教 ,谢谢

    二,解决过程

    1,创建表,需要在plsql中的command窗口

    create table e
    (
     a numeric,
      b varchar2(50)
    );

    2,创建存储过程,在plsql中,和trigger的创建方式差不多。

    create or replace procedure insert_a
    is
    temp varchar2(20):='aaaa';
    begin
       for i in 1..100 loop
          insert into e(a,b) values(i,temp);
       end loop;
    end;
     

    3,在command窗口调用存储过程exec,注意调用成功之后,需要按下plsql的“写入”按钮,和使用update之后commit写入一样。

    4,执行之后的e表,100条记录出来了。

    三,oracle存储过程详解。转自http://blog.163.com/study_notes/blog/static/17610324320118610611676/

    存储过程
    1 什么是存储过程?
    ?用于在数据库中完成特定的操作或者任务。是一个PLSQL程序块,可以永久的保存在数据库中以供其他程序调用。

    
    

    2 存储过程的参数模式

    
    


    存储过程的参数特性:
    ?IN类型的参数?OUT类型的参数?IN-OUT类型的参数
    值被?传递给子程序?返回给调用环境?传递给子程序
    返回给调用环境
    参数形式?常量?未初始化的变量?初始化的变量
    使用时?默认类型?必须明确指定?必须明确指定

    
    


    3 无参数存储过程的使用:
    CREATE OR REPLACE PROCEDURE 过程名 [(parameter,...)]
    IS
    定义变量
    Begin
    Plsql程序
    End;

    
    

    例:创建一个存储过程,用于向数据库中插入一条记录。
    第一步:创建
    CREATE OR REPLACE PROCEDURE pro_1
    IS
    Begin
    insert into person values (11,'aa','aav');
    End;

    
    

    第二步:在sql*plus中执行该过程
    exec pro_1;

    
    

    第三步:通过JDBC使用存储过程。
    ?private Connection conn = null;
    ?private ResultSet rs = null;
    ?private CallableStatement state = null;
    ?//调用一个无参数的存储过程
    ?public void testPro()
    ?{
    conn = Tools.getConnection();
    try {
    state = conn.prepareCall("{call pro_1}");
    state.execute();
    } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    ?}

    
    


    4 带有IN类型参数的存储过程的使用。
    例:创建一个存储过程,用于向数据库中插入一条记录。
    第一步:创建
    CREATE OR REPLACE PROCEDURE pro_2(id number,name varchar2,email varchar2)
    IS
    Begin
    insert into person values (id,name,email);
    End;
    第二步:在sql*plus中执行该过程
    exec pro_2(12,'aaa','aaa');

    
    

    第三步:通过JDBC使用存储过程。
    ?//使用一个带有 IN 类型参数的存储过程
    ?public void testPro_in(int id,String name,String email)
    ?{
    conn = Tools.getConnection();
    try {
    state = conn.prepareCall("{call pro_2(?,?,?)}");
    state.setLong(1, id);
    state.setString(2, name);
    state.setString(3, email);
    state.execute();
    } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    ?}

    
    

    5 带有out类型参数的存储过程的使用。
    例:创建一个存储过程,用于返回数据库中的Person表的总行数。

    
    

    第一步:创建
    CREATE OR REPLACE PROCEDURE pro_3(num out number)
    IS
    mynum number;
    Begin
    select count(*) into mynum from person;
    num := mynum;
    End;
    或者
    CREATE OR REPLACE PROCEDURE pro_3(num out number)
    IS
    Begin
    select count(*) into num from person;
    End;

    
    

    第二步:在sql*plus中执行该过程
    declare
    a number;
    begin
    pro_3(a);
    dbms_output.put_line(a);
    end;

    
    

    第三步:通过JDBC使用存储过程。
    public void testPro_out()
    ?{
    conn = Tools.getConnection();
    try {
    state = conn.prepareCall("{call pro_3(?)}");
    state.registerOutParameter(1, Types.NUMERIC);
    state.execute();
    int num = state.getInt(1);
    System.out.println(num);
    } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    ?}

    
    

    6 带有in-out类型参数的存储过程的使用。
    创建:
    CREATE OR REPLACE PROCEDURE pro_4(num in out number)
    IS
    a number := 100;
    Begin
    num := a*num;
    End;

    
    

    sql*plus中执行该过程
    declare
    a number := 12;
    begin
    pro_4(a);
    dbms_output.put_line(a);
    end;




     

  • 相关阅读:
    《大道至简》读书笔记 第3篇
    《大道至简》读书笔记 第2篇
    返回一个二维整数数组中最大联通子数组的和(思路)
    《大道至简》读书笔记 第1篇
    给尊敬的王老师
    团队开发——冲刺2.g
    第一阶段冲刺的总结报告
    团队开发——冲刺2.f
    《人月神话》读书笔记 第3篇
    团队开发——冲刺2.e
  • 原文地址:https://www.cnblogs.com/sumsen/p/2547110.html
Copyright © 2020-2023  润新知