Oracle 存储过程—为数传递变量
|
oracle 存储过程的基本语法 示例: create or replace procedure sp_name ( begin 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 循环? --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_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_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,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,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.创建可以调用其他存储过程的存储过程 (编辑:安卓应用网_ASP源码网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
