之前一直写触发器,期间一直接触和听说了存储过程,好多天过去了,今天才第一次使用了存储过程。
一,问题提出:http://zhidao.baidu.com/question/113921713.html
求一个oracle程序块,循环插入A表一百行数据.
就是定义一个变量,然后让人他循环一百次,往数据库里插入数据. 插入的行只有一列是不一样的,就是这个变量,其它一样.请问如何写. 表结构就二列.一个是放这个变量 a列,一个是名称列. create table A ( a numeric, b varchar2(50) ) 有会的请赐教 ,谢谢
二,解决过程
1,创建表,需要在plsql中的command窗口
create table e ( a numeric, b varchar2(50) );
2,创建存储过程,在plsql中,和trigger的创建方式差不多。
create or replace procedure insert_a is temp varchar2(20):='aaaa'; begin for i in 1..100 loop insert into e(a,b) values(i,temp); end loop; end;
3,在command窗口调用存储过程exec,注意调用成功之后,需要按下plsql的“写入”按钮,和使用update之后commit写入一样。
4,执行之后的e表,100条记录出来了。
存储过程
1 什么是存储过程?
?用于在数据库中完成特定的操作或者任务。是一个PLSQL程序块,可以永久的保存在数据库中以供其他程序调用。
2 存储过程的参数模式
存储过程的参数特性:
?IN类型的参数?OUT类型的参数?IN-OUT类型的参数
值被?传递给子程序?返回给调用环境?传递给子程序
返回给调用环境
参数形式?常量?未初始化的变量?初始化的变量
使用时?默认类型?必须明确指定?必须明确指定
3 无参数存储过程的使用:
CREATE OR REPLACE PROCEDURE 过程名 [(parameter,...)]
IS
定义变量
Begin
Plsql程序
End;
例:创建一个存储过程,用于向数据库中插入一条记录。
第一步:创建
CREATE OR REPLACE PROCEDURE pro_1
IS
Begin
insert into person values (11,'aa','aav');
End;
第二步:在sql*plus中执行该过程
exec pro_1;
第三步:通过JDBC使用存储过程。
?private Connection conn = null;
?private ResultSet rs = null;
?private CallableStatement state = null;
?//调用一个无参数的存储过程
?public void testPro()
?{
conn = Tools.getConnection();
try {
state = conn.prepareCall("{call pro_1}");
state.execute();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
?}
4 带有IN类型参数的存储过程的使用。
例:创建一个存储过程,用于向数据库中插入一条记录。
第一步:创建
CREATE OR REPLACE PROCEDURE pro_2(id number,name varchar2,email varchar2)
IS
Begin
insert into person values (id,name,email);
End;
第二步:在sql*plus中执行该过程
exec pro_2(12,'aaa','aaa');
第三步:通过JDBC使用存储过程。
?//使用一个带有 IN 类型参数的存储过程
?public void testPro_in(int id,String name,String email)
?{
conn = Tools.getConnection();
try {
state = conn.prepareCall("{call pro_2(?,?,?)}");
state.setLong(1, id);
state.setString(2, name);
state.setString(3, email);
state.execute();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
?}
5 带有out类型参数的存储过程的使用。
例:创建一个存储过程,用于返回数据库中的Person表的总行数。
第一步:创建
CREATE OR REPLACE PROCEDURE pro_3(num out number)
IS
mynum number;
Begin
select count(*) into mynum from person;
num := mynum;
End;
或者
CREATE OR REPLACE PROCEDURE pro_3(num out number)
IS
Begin
select count(*) into num from person;
End;
第二步:在sql*plus中执行该过程
declare
a number;
begin
pro_3(a);
dbms_output.put_line(a);
end;
第三步:通过JDBC使用存储过程。
public void testPro_out()
?{
conn = Tools.getConnection();
try {
state = conn.prepareCall("{call pro_3(?)}");
state.registerOutParameter(1, Types.NUMERIC);
state.execute();
int num = state.getInt(1);
System.out.println(num);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
?}
6 带有in-out类型参数的存储过程的使用。
创建:
CREATE OR REPLACE PROCEDURE pro_4(num in out number)
IS
a number := 100;
Begin
num := a*num;
End;
在sql*plus中执行该过程
declare
a number := 12;
begin
pro_4(a);
dbms_output.put_line(a);
end;