oracle 存过传变量,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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值