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") + "\tusername:"
					+ rs.getString("username") + "\tinsertdate:"
					+ 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;

原文地址:https://www.cnblogs.com/klb561/p/11294314.html

时间: 2024-08-29 13:34:55

Oracle 存储过程—为数传递变量的相关文章

[转]oracle存储过程、声明变量、for循环

oracle存储过程.声明变量.for循环 1.创建存储过程 create or replace procedure test(var_name_1 in type,var_name_2 out type) as --声明变量(变量名 变量类型) begin --存储过程的执行体 end test; 打印出输入的时间信息 E.g: create or replace procedure test(workDate in Date) is begin dbms_output.putline(&ap

oracle存储过程、声明变量、for循环|转|

oracle存储过程.声明变量.for循环 1.创建存储过程 create or replace procedure test(var_name_1 in type,var_name_2 out type) as --声明变量(变量名 变量类型) begin --存储过程的执行体 end test; 打印出输入的时间信息 E.g: create or replace procedure test(workDate in Date) is begin dbms_output.putline(&ap

oracle存储过程、声明变量、for循环

oracle存储过程.声明变量.for循环  1.创建存储过程 create or replace procedure test(var_name_1 in type,var_name_2 out type) as --声明变量(变量名 变量类型) begin --存储过程的执行体 end test; 打印出输入的时间信息 E.g: create or replace procedure test(workDate in Date) is begin dbms_output.putline(&a

java 实现往oracle存储过程中传递array数组类型的参数

注:本文来源于 <  java 实现往oracle存储过程中传递array数组类型的参数  > 最近项目中遇到通过往存储过程传递数组参数的问题, 浪费了N多个小时,终于有点头绪. 具体的代码就不写上了,因为项目中存储过程的调用方法全部是封装好的(好像现在都这样,都姓3层,嘿嘿) 原理: 1.一维数组 A.单纯的一维数组的话,直接建立一个table类型就可以 1 TYPE TYPE_VARCHAR AS TABLE OF VARCHAR2(200); 2.多维数组 A.多维数组就要稍加修改了,如

HIbernate Oracle存储过程

之前为了实现基于Hibernate+Oracle的存储过程调用,发现了一个又一个坑,然后一个一个的尝试解决. 需求:使用Hibernate调用Oracle的存储过程,需要支持的有动态表名.存储过程变量定义.数组传递 1. oracle变量定义 首先,需要解决的是如何在oracle存储过程中定义变量,否则连存储过程都没法写 变量赋值 在AS…BEGIN中间插入要定义的变量foo 使用select into foo语法 -- http://stackoverflow.com/questions/16

oracle 存储过程 变量的声明和赋值的3种方式

oracle 存储过程 变量的声明和赋值的3种方式 CreationTime--2018年8月31日16点00分 Author:Marydon 1.声明变量的3种方式 按照数据类型的声明方式进行区分 方式一:直接声明数据类型 格式:变量名 数据类型(大小) V_START_DATE VARCHAR2(19); v_num number; 说明: 设置为字符串类型时,需要指定大小,否则报错: 变量的声明必须在"begin"关键字之前进行. --错误用法 BEGIN v_sql varch

oracle存储过程实例

oracle存储过程实例 分类: 数据(仓)库及处理 2010-05-03 17:15 1055人阅读 评论(2)收藏 举报 认识存储过程和函数 存储过程和函数也是一种PL/SQL块,是存入数据库的PL/SQL块.但存储过程和函数不同于已经介绍过的PL/SQL程序,我们通常把PL/SQL程序称为无名块,而存储过程和函数是以命名的方式存储于数据库中的.和PL/SQL程序相比,存储过程有非常多长处,详细归纳例如以下: * 存储过程和函数以命名的数据库对象形式存储于数据库其中.存储在数据库中的长处是非

oracle 存储过程详细介绍(创建,删除存储过程,参数传递等)

这篇文章主要介绍了oracle 创建,删除存储过程,参数传递,创建,删除存储函数,存储过程和函数的查看,包,系统包等相关资料,需要的朋友可以参考下 oracle 创建,删除存储过程,参数传递,创建,删除存储函数,存储过程和函数的查看,包,系统包 认识存储过程和函数 存储过程和函数也是一种PL/SQL块,是存入数据库的PL/SQL块.但存储过程和函数不同于已经介绍过的PL/SQL程序,我们通常把PL/SQL程序称为无名块,而存储过程和函数是以命名的方式存储于数据库中的.和PL/SQL程序相比,存储

面试概率极大的Oracle存储过程

1.什么是存储过程.存储过程是数据库服务器端的一段程序,它有两种类型.一种类似于SELECT查询,用于检索数据,检索到的数据能够以数据集的形式返回给客户.另一种类似于INSERT或DELETE查询,它不返回数据,只是执行一个动作.有的服务器允许同一个存储过程既可以返回数据又可以执行动作.2.什么时候需要用存储过程 如果服务器定义了存储过程,应当根据需要决定是否要用存储过程.存储过程通常是一些经常要执行的任务,这些任务往往是针对大量的记录而进行的.在服务器上执行存储过程,可以改善应用程序的性能.这