• Oracle 存储过程—为数传递变量


    oracle 存储过程的基本语法
    create or replace procedure proc1(
    p_para1 varchar2,
    p_para2 out varchar2,
    p_para3 in out varchar2
    )as
    v_name varchar2(20);
    begin
    v_name := '张三丰';
    p_para3 := v_name;
    dbms_output.put_line('p_para3:'||p_para3);
    end;
    注:创建语句:create or replace procedure 存储过程名,如果没有or replace语句,则仅仅是新建一个存储过程。如果系统存在该存储过程,则会报错。Create or replace procedure 如果系统中没有此存储过程就新建一个,如果系统中有此存储过程则把原来删除掉,重新创建一个存储过程。 
    存储过程名定义:包括存储过程名和参数列表。参数名和参数类型。参数名不能重复, 参数传递方式:IN, OUT, IN OUT 
    IN 表示输入参数,按值传递方式。 
    OUT 表示输出参数,可以理解为按引用传递方式。可以作为存储过程的输出结果,供外部调用者使用。 
    IN OUT 即可作输入参数,也可作输出参数。 
    参数的数据类型只需要指明类型名即可,不需要指定宽度。 
    参数的宽度由外部调用者决定。 
    过程可以有参数,也可以没有参数 
    变量声明块:紧跟着的as (is )关键字,可以理解为pl/sql的declare关键字,用于声明变量。 
    变量声明块用于声明该存储过程需要用到的变量,它的作用域为该存储过程。另外这里声明的变量必须指定宽度。遵循PL/SQL的变量声明规范。 
    过程语句块:从 begin 关键字开始为过程的语句块。存储过程的具体逻辑在这里来实现。 
    异常处理块:关键字为exception ,为处理语句产生的异常。该部分为可选 
    结束块:由end关键字结果。

    示例:

    create or replace procedure sp_name (
    -- 入参、出参列表, 逗号分隔。
    uid in varchar2, -- 不能带长度信息
    startDate in date, -- 第二个输入参数
    defaultVar in varchar2 default "", -- 默认参数,如果不传,要注意参数的顺序
    isok out number, -- 输出参数
    result out varchar2 -- 第二个输出参数
    )
    as
    -- 变量声明,每个声明用分号结束,可以在声明的同时初始化
    var1 varchar2(11);
    var2 number(2) := 123;

    begin
    -- 字符串拼接用 ||
    dbms_output.put_line('isok:' || 'abc');

    -- 调用其他存储过程
    sub_sp_name(param1, prarm2, outParam1, outParam2);

    end; -- 存储过程结束
    ---------------------

    --1. 语句块的定义

    declare
      -- 变量声明
      var1 number(2); -- 仅声明
      var2 char(2) := 'var2'; -- 在声明的同时初始化
    
    begin
      -- 语句
    end; -- 语句块结束
    

    --2. if语句

    if a = 1 or b = 2 then
      
    elsif c = 3 then
    
    else
      
    end if;
    

    --3.  case分支控制语句

    这里的dbms_output.put_line() 是输出的方法,在dos里需要在这之前输入set serveroutput on;才会输出相应的信息

    declare
    num number(10) := 11;
    begin
        case 
            when num = 10 then dbms_output.put_line( '我是10');
            when num = 11 then dbms_output.put_line( '我是11');
            else  dbms_output.put_line( '我不知道我是谁了');
        end case;
        
        case num
            when 0 then dbms_output.put_line( '我是10');
            when 1 then dbms_output.put_line( '我是11');
            else  dbms_output.put_line( '我不知道我是谁了');
        end case;
    end;
    

    --4. for 循环 
    --for循环主要有两个用处。

    --4.1、 循环一个范围
      declare
        i number(2);
      begin
        for i in 0 .. 9 loop
          dbms_output.put_line('i:' || i);
        end loop;
      end;
    
    -- 4.2、遍历隐式游标
    
     --隐式游标的好处是不需要手动关闭,方便
    
    BEGIN
     FOR re IN (SELECT username FROM userinfo)  LOOP
      DBMS_OUTPUT.PUT_LINE(re.username);
     END LOOP;
    END;
    


    二、下面是存储过程的使用:

    我这里创建了一个表userinfo,

    -- Create table创建表
    create table userinfo
    (
      id       varchar2(32) not null,
      username varchar2(20),
      password varchar2(20),
      sex      varchar2(2),
      sal number(20),
      insertdate date default sysdate
    )
    ;
    -- Add comments to the columns 
    comment on column userinfo.id
      is 'id';
    comment on column userinfo.username
      is '用户名';
    comment on column userinfo.password
      is '密码';
    comment on column userinfo.sex
      is '性别';
      comment on column userinfo.sal
      is '工资';
      comment on column userinfo.insertdate
      is '插入时间';

    2.1创建插入数据的存储过程并调用

    CREATE OR REPLACE
    --创建存储过程,如果存在就更新,不存在就创建,插入一条数据
    procedure proc_test(e_id       in varchar,
                        e_username in varchar,
                        e_password in varchar,
                        e_sex      in varchar,
                        e_sal      in number)
    --这里的参数不要限定长度,否则会错误
     is
    begin
      insert into userinfo
        (id, username, password, sex, sal)
      values
        (e_id, e_username, e_password, e_sex, e_sal);
    end;
    
      --调用1
    DECLARE
      id       varchar(32);
      username varchar(20);
      password varchar(20);
      sex      varchar(2);
      sal      number(20);
    BEGIN
      id       := 'asdfasdfa';
      username := 'text11';
      password := 'pas';
      sex      := '男';
      sal      := 2000;
      proc_test(e_id       => id,
                e_username => username,
                e_password => password,
                e_sex      => sex,
                e_sal =>sal);
      commit;
    END;
    
    select * from userinfo;--查看数据插入成功
    
    ---调用2
    begin
      proc_test(e_id => 'dd', e_username => 'A',e_password => 'aa', e_sex => 'd',e_sal => 1000);
      commit;
    end;
    --调用3
    call  proc_test(e_id => 'dd', e_username => 'A',e_password => 'aa', e_sex => 'd',e_sal => 1000);
    commit;
    

    java中的调用:

    public static void insert() throws ClassNotFoundException, SQLException {
    		String url = "jdbc:oracle:thin:@localhost:1521:orcl";
    		String name = "user2";
    		String pwd = "user2";
    		String Drivername = "oracle.jdbc.driver.OracleDriver";
    		Class.forName(Drivername);
    		Connection connection = DriverManager.getConnection(url, name, pwd);
    		CallableStatement call = connection
    				.prepareCall("call PROc_TEST(e_id => 'dd', e_username => 'A',e_password => 'aa', e_sex => 'd',e_sal => 1000)");
    		// 执行存储过程
    		boolean b = call.execute();
    		if (b = true) {
    			System.out.println("插入成功!");
    		}
    		connection.close();
    	}

    --2. 创建带返回参数的

    --in是输入入的参数,out是输出的参数
       CREATE OR REPLACE procedure proc_test1(t in varchar,
                                                           r out varchar) as
       begin
         
         select count(*) into r from userinfo where username like t;
       end;
    --调用,
     --在dos里执行多行语句是以'/'表示结束
      DECLARE outobj VARCHAR2(4);
           BEGIN
                 proc_test1(t => 'A',r => outobj );
                   dbms_output.put_line('outobj = ' || outobj);
           END;
    

    java中的调用:

    public static void one() throws ClassNotFoundException, SQLException {
    		String url = "jdbc:oracle:thin:@localhost:1521:orcl";
    		String name = "user2";
    		String pwd = "user2";
    		String Drivername = "oracle.jdbc.driver.OracleDriver";
    		Class.forName(Drivername);
    		Connection conn = DriverManager.getConnection(url, name, pwd);
    		CallableStatement proc = conn
    				.prepareCall("{ call PROC_TEST1(?,?) }"); // 存储过程
    		proc.setString(1, "%A%");// 设置第一个参数输入参数
    		proc.registerOutParameter(2, Types.VARCHAR);// 第二个参数输出参数,是VARCHAR类型的
    		proc.execute();// 执行
    		String testPrint = proc.getString(2);// 获得输出参数
    		System.out.println("=用户名包含A的个数为=" + testPrint);
    		conn.close();
    	}

    --3.创建带查询结果的

    --3. 由于oracle存储过程没有返回值,它的所有返回值都是通过out参数来替代的,列表同样也不例外,但由于是集合,所以不能用一般的参数,必须要用pagkage了.所以要分两部分,
    
    --3.1, 建一个程序包。如下:
    create or replace package testpackage as
      type test_cursor is ref cursor;
    end;
    
    --3.2,建立存储过程,存储过程为:
    create or replace procedure testc(p_cursor out testpackage.test_cursor) is
    begin
      open p_cursor for
        select * from userinfo;
    end;
    

    java中的调用:

    public static void select() throws ClassNotFoundException, SQLException {
    		String url = "jdbc:oracle:thin:@localhost:1521:orcl";
    		String name = "user2";
    		String pwd = "user2";
    		String Drivername = "oracle.jdbc.driver.OracleDriver";
    		Class.forName(Drivername);
    		Connection conn = DriverManager.getConnection(url, name, pwd);
    		CallableStatement proc = conn.prepareCall(" call testc(?) "); // 存储过程
    		proc.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR);// 设置输出参数是一个游标.第一个参数,游标类型
    		proc.execute();// 执行
    		ResultSet rs = (ResultSet) proc.getObject(1); // 获得第一个参数是一个游标,转化成ResultSet类型
    		while (rs.next()) // 获得数据
    		{
    			System.out.println("id:" + rs.getString("id") + "	username:"
    					+ rs.getString("username") + "	insertdate:"
    					+ rs.getString("insertdate"));
    
    		}
    	}

    4.创建可以调用其他存储过程的存储过程

    -------------------------- 3.实例
    create or replace procedure sp_name(defaultVar in varchar2 default 'A') -- 默认参数,如果不传,要注意参数的顺序
     as
      -- 变量声明,每个声明用分号结束。可以在声明的同时初始化
      robj varchar2(4);
      var2 number(20) := 123;
    
    begin
      -- 字符串拼接用 ||
      dbms_output.put_line('isok:' || 'abc');
    
      -- 调用其他存储过程
      proc_test1(T => 'A', R => robj);
      dbms_output.put_line('R = ' || R);
    
    end; -- 存储过程结束
    
    --调用
    
    begin
      sp_name('A');
    
    end;
  • 相关阅读:
    Programming Windows 第五版读书笔记 第三章 窗口和消息
    一个带游标的遍历数据的函数|数据库操作|软件开发
    递归删除一个文件夹下的所有文件c#代码
    杭州市市民卡办理点
    NTLDR is missing 的解决方法
    SQL Server中 将日期格式化.函数 CONVERT
    1.显示网页中的所有图片
    用sql函数获取中文字符串的全拼
    地柜便利一个文件夹下的所有文件|软件开发
    软件是什么
  • 原文地址:https://www.cnblogs.com/klb561/p/11294314.html
Copyright © 2020-2023  润新知