Oracle 存储过程—为数传递变量
发布日期:2021-08-15 09:34:07 浏览次数:2 分类:技术文章

本文共 7147 字,大约阅读时间需要 23 分钟。

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 thenelse  end if;

 

 

 

 

 

--3.  case分支控制语句

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

 

declarenum 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)--这里的参数不要限定长度,否则会错误 isbegin  insert into userinfo    (id, username, password, sex, sal)  values    (e_id, e_username, e_password, e_sex, e_sal);end;  --调用1DECLARE  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;--查看数据插入成功

 

 

 

 

 

 

---调用2begin  proc_test(e_id => 'dd', e_username => 'A',e_password => 'aa', e_sex => 'd',e_sal => 1000);  commit;end;--调用3call  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) isbegin  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

转载地址:https://blog.csdn.net/weixin_30757793/article/details/99647390 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:用js触发CSS3-transition过渡动画
下一篇:freopen的锅

发表评论

最新留言

很好
[***.229.124.182]2024年04月19日 13时56分02秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

spring boot 与 Ant Design of Vue 实现修改组织(二十五) 2019-04-27
spring boot 与 Ant Design of Vue 实现删除组织(二十六) 2019-04-27
spring boot 与 Ant Design of Vue 实现获取用户列表(二十七) 2019-04-27
spring boot 与 Ant Design of Vue 实现新增用户(二十八) 2019-04-27
spring boot 与 Ant Design of Vue 实现修改用户(二十九) 2019-04-27
spring boot 与 Ant Design of Vue 实现删除用户(三十) 2019-04-27
spring boot 与 Ant Design of Vue 鉴权体系登录的实现(三十一) 2019-04-27
spring boot 与 Ant Design of Vue 鉴权体系获取用户信息的实现(三十二) 2019-04-27
Druid连接池实现自定义场景的多数据库的连接 2019-04-27
CentOs7命令行(静默)的方式安装oracle数据库 2019-04-27
基于VMware安装CentOs7的镜像 2019-04-27
PL/SQL数据库管理工具的使用 2019-04-27
带你玩转属于自己的spring-boot-starter系列(一) 2019-04-27
带你玩转属于自己自己的spring-boot-starter系列(二) 2019-04-27
带你玩转属于自己的spring-boot-starter系列(三) 2019-04-27
基于SnowFlake算法如何让分库分表中不同的ID落在同一个库的算法的实现 2019-04-27
基于springboot的ShardingSphere5.X的分库分表的解决方案之分库解决方案(二) 2019-04-27
基于springboot的ShardingSphere5.X的分库分表的解决方案之分表解决方案(一) 2019-04-27
基于springboot的ShardingSphere5.X的分库分表的解决方案之关联查询解决方案(三) 2019-04-27
Linux文件管理参考 2019-04-27