pl/sql中,匿名块我们要想下一次执行,则需要保存在磁盘介质上,这样每次用的时候,很麻烦。下面简单的介绍存储过程
存储过程:
不带参数的存储过程:
create or replace procedure WOO is
v_sum number :=0;
begin
for i in 1 .. 100
loop
v_sum := v_sum + i;
end loop;
DBMS_OUTPUT.PUT_LINE(v_sum);
end WOO;
调用:
我们在pl/sql中测试:
begin
-- Call the procedure
woo;
end;
5050
5050
PL/SQL 过程已成功完成。
我们在sqlplus里执行:
SQL> declare
2 v_name varchar2(10); ==>注意这里我们需要定义一个变量用来接收传出的p_name
3 begin
4 P_I(1, v_name );
5 DBMS_OUTPUT.PUT_LINE( v_name );
6 end;
7 /
wang
PL/SQL 过程已成功完成。
我们根据输入的ID来查找name:
create or replace procedure P_n(p_id_name in out varchar2)
is
begin
select name into p_id_name from t where id =to_number( p_id_name); ==>注意这里我们强制转换,oracle也会自动转换,但是如果自己不强制转换,如果id上有索引,则就不走索引了
end P_n;
在pl/sql里测试:
通过上面的带参数举例,细心的读者已经发现已经说明了在pl/sql中很让初学者头疼的in , out , in out参数:
in:在块中不可以改变,传进去的数不可以改变,如果上面的块中有p_id=3,则会报错
out: OUT表示从存储过程返回参数
in out : IN OUT 表示传递参数和返回参数
函数:
上面已经介绍了存储过程,存储过程可以代替函数,只是函数有返回值。过程和函数很多相似,下面简述函数:
不带参数的函数:
create or replace function jisuan return number is
v_sum number :=0;
begin
for i in 1..100
loop
v_sum := v_sum + i;
end loop;
DBMS_OUTPUT.PUT_LINE(v_sum);
return v_sum ;
end jisuan; ==>这里可以写上函数名称或者直接省略也行
带参数的函数:
create or replace function f_diy(r in number) return number is
s number := 0;
PI constant number := 3.14159;
begin
s :=PI*r*r;
return s;
DBMS_OUTPUT.PUT_LINE(s);
end f_diy;
在sqlplus里执行:
SQL> select f_diy(90) wang from dual;
WANG
----------
25446.879
存储过程:
不带参数的存储过程:
create or replace procedure WOO is
v_sum number :=0;
begin
for i in 1 .. 100
loop
v_sum := v_sum + i;
end loop;
DBMS_OUTPUT.PUT_LINE(v_sum);
end WOO;
调用:
我们在pl/sql中测试:
begin
-- Call the procedure
woo;
end;
5050
在sqlplus中测试:
SQL> execute woo; ==>(EXEC)
5050
PL/SQL 过程已成功完成。
或者:
SQL> begin
2 woo;
3 end;
4 /
5050
PL/SQL 过程已成功完成。
带参数的存储过程:
在pl/sql里执行:
SQL> begin
2 woo;
3 end;
4 /
5050
PL/SQL 过程已成功完成。
用户hr里有张表t
我们向t里插进数据行:
create or replace procedure P_t(p_id in int, p_name in varchar2) is
begin
insert into t values(p_id,p_name);
COMMIT;
end P_t;
在pl/sql测试:
begin
-- Call the procedure
p_t(p_id => :p_id,
p_name => :p_name);
end;
下面输入窗口里的类型是float,string,oracle里没有这连个类型,我想应该是工具的问题.
我们根据id查找name:
create or replace procedure P_i(p_id in number, p_name out varchar2) is ==>注意这里的类型后面不需要加精度,只需要写上变量的类型
begin
select name into p_name from t where id=p_id;
end P_i;
我们向t里插进数据行:
create or replace procedure P_t(p_id in int, p_name in varchar2) is
begin
insert into t values(p_id,p_name);
COMMIT;
end P_t;
在pl/sql测试:
begin
-- Call the procedure
p_t(p_id => :p_id,
p_name => :p_name);
end;
下面输入窗口里的类型是float,string,oracle里没有这连个类型,我想应该是工具的问题.
我们根据id查找name:
create or replace procedure P_i(p_id in number, p_name out varchar2) is ==>注意这里的类型后面不需要加精度,只需要写上变量的类型
begin
select name into p_name from t where id=p_id;
end P_i;
我们在sqlplus里执行:
SQL> declare
2 v_name varchar2(10); ==>注意这里我们需要定义一个变量用来接收传出的p_name
3 begin
4 P_I(1, v_name );
5 DBMS_OUTPUT.PUT_LINE( v_name );
6 end;
7 /
wang
PL/SQL 过程已成功完成。
我们根据输入的ID来查找name:
create or replace procedure P_n(p_id_name in out varchar2)
is
begin
select name into p_id_name from t where id =to_number( p_id_name); ==>注意这里我们强制转换,oracle也会自动转换,但是如果自己不强制转换,如果id上有索引,则就不走索引了
end P_n;
在pl/sql里测试:
通过上面的带参数举例,细心的读者已经发现已经说明了在pl/sql中很让初学者头疼的in , out , in out参数:
in:在块中不可以改变,传进去的数不可以改变,如果上面的块中有p_id=3,则会报错
out: OUT表示从存储过程返回参数
in out : IN OUT 表示传递参数和返回参数
函数:
上面已经介绍了存储过程,存储过程可以代替函数,只是函数有返回值。过程和函数很多相似,下面简述函数:
不带参数的函数:
create or replace function jisuan return number is
v_sum number :=0;
begin
for i in 1..100
loop
v_sum := v_sum + i;
end loop;
DBMS_OUTPUT.PUT_LINE(v_sum);
return v_sum ;
end jisuan; ==>这里可以写上函数名称或者直接省略也行
create or replace function f_diy(r in number) return number is
s number := 0;
PI constant number := 3.14159;
begin
s :=PI*r*r;
return s;
DBMS_OUTPUT.PUT_LINE(s);
end f_diy;
在sqlplus里执行:
SQL> select f_diy(90) wang from dual;
WANG
----------
25446.879