设为首页 收藏本站
查看: 968|回复: 0

[经验分享] Oracle数据库之PLSQL过程

[复制链接]

尚未签到

发表于 2016-7-31 15:43:48 | 显示全部楼层 |阅读模式
--============PLSQL==子程序=====
----===========匿名子程序=
--匿名块不存在数据库中
--每次使用时都会进行编译
--不能再其他块中相互调用
--匿名子程序语法格式如下(总结)
declare
cursor is select .. -- 游标
type (is record  ,is table of .. index by) --record类型 ,关联数组
variable type --变量
begin
execute immediate 'create table'; --动态sql执行ddl
insert into  --静态SQL执行DML
execute immediate 'insert into..' --动态sql执行DML
TCL (commit ;rollback) -- 静态SQL执行TCL
select (select into 单行) --  0,单行,
cursor  (loop while for fetch into) --  多行
select ....bulk collect into  -- bulk collect,减少内存空间交互数据的次数
curosr (fetch bulk collect into)
cursor (while fetch bulk collect into 。。。limit n)--Limit限制抓取的记录
--关联数组的处理
--声明,赋值,引用,方法:first,last,next,exists,count
-- 循环结构
-- Loop exit; for i in 1..10 loop ; while  xxx LOOP;  
exception
--- oracle预定义异常(直接使用)
--- 非oracle预定义异常(绑定,使用)
--- 用户自定义异常(声明,触发,使用)
end

----==========有名子程序==========
--命名的PL/SQL块,编译时并存储在数据库中,可以在任何需要的地方调用
--子程序的组成部分:
-----子程序头
-----声明部分
-----可执行部分
-----异常处理部分(可选)
-----------有名子程序的分类
--procedure 过程
--function 函数
--package 包
--trigger 触发器
--===========有名子程序的优点:
--模块化 : 将程序分解成逻辑模块
--可重用性:可以被任意数目的程序调用
--可维护性 : 简化维护操作
--安全性 : 通过设置权限,使数据库更安全

--=======过程 procedure=============
create or replace procedure 过程名字
[arg_name in | out| int out (argument-type)] --参数都是可选
is / as
变量声明
begin
执行部分
exception
异常部分
end;
--指定员工编号(in 参数) ,打印员工信息
create or replace procedure p_emp(id in number) --参数不需要指定大小范围
is
-- print_emp(id number) is 参数不需要指定大小范围,默认in
v_emp emp%rowtype; --变量
begin
select * into v_emp from emp where empno = id;
dbms_output.put_line(v_emp.ename);
Exception
when NO_DATA_FOUND
then dbms_output.put_line('not exists '||id);
end;
--========调用存储过程:
--1. 用匿名块调用
begin
call p_emp(7900);
end;
--2.在sql工作表中直接调用
call p_emp(7900);--正常输出
exec p_emp(7900);
---==============存储过程中的参数===
create or replace procedure proc1
(p_c1 varchar2,   p_c2 out varchar2,p_c3 in out varchar2)
is
v_c1 varchar2(10);
begin
--  in ,参数的缺省模式,在过程内部,形参只是可读的.
-- p_c1 :=p_c1||'d'; 错误的
v_c1 :=p_c1;
dbms_output.put_line('in : p_c1-->'||p_c1||':::v_c1-->'||v_c1);
-- out: 在调用过程中,任何的实参将被忽略,即值不会赋给对应的形参,
dbms_output.put_line('out :p_c2的值-->:'||p_c2); --不会输出任何内容
p_c2 :=p_c2 ||'d';
--在过程内部,形参可以被读出也可以被写入,
dbms_output.put_line('out :p_c2 赋值后的值-->:'||p_c2);--输出 'd';
--过程执行完成后形参的当前值被赋给对应的实参.
--in 和 out 的结合
p_c3 :=p_c3 ||'d';--可以被赋值,可以传入值,可以传出值
dbms_output.put_line('int  out : p_c2赋值后的值-->:'||p_c3);--'ccd';
end;
call proc1('a','abc',p_c2);-- error , 第3个参数是输出参数,不能赋值
--利用匿名块调用
declare
v_c2 varchar2(10) :='bb';
v_c3 varchar2(10) :='cc';
begin
proc1('aa',v_c2,v_c3);
dbms_output.put_line('v_c2:'||v_c2);--在plsql赋值的:d
dbms_output.put_line('v_c3:'||v_c3);--ccd
end;
--关于参数的再次分析
create or replace proc1(p1 in number)
--p1 形式参数
is
p2 number(4) :=0; -- p2局部变量
begin
p2 :=p1; --in 参数赋值给过程中的局部变量
dbms_output.put_line('p2:'||p2);
end;
--调用
declare
v_n1 number(3) :=1;
proc1(v_n1); --实参
proc1(2); --实参
end;
--总结:
-- 模式为in时:形参对应的实际参数可以是常量或变量.
--模式为in out / out的形参对应的实际参数必须是变量,
--用于存储返回的值,所以不能是常量或表达式.

--============带参数的过程调用:=========

-- 指定一行记录record,增加该记录的薪水salary,返回改emp的id
create or replace procedure proc1(salary in number,
id out number, v_emp emp%rowtype)
--形式参数不能声明长度,但可使用%type来限制.
is
begin
dbms_output.put_line('--修改前的薪水--'||v_emp.sal);
update emp set sal = (sal+salary) where empno=v_emp.empno;
id :=v_emp.empno;--out参数赋值
dbms_output.put_line('--修改的员工id--'||id);
end;
--1.位置标示法
---调用时填入所有的参数,实参跟形参顺序一一对应
declare
v_emp emp%Rowtype;
v_id number(4);
begin
select * into v_emp from emp where empno = 7900;
proc1(1000,v_id,v_emp);
end;
--2.名字表示法
---调用时给出形参名字,并给出实参
declare
v_emp emp%Rowtype;
v_id number(4);
begin
select * into v_emp from emp where empno = 7900;
-- 名字必须对应
--proc1(salary=>1000,a=>v_id,v_emp=>v_emp); error
proc1(salary=>1000,id=>v_id,v_emp=>v_emp);
end;

--3,混用,第一个参数必须通过位置来指定
--procname(12,p_outparm=>v_var1, p_inout=>10);
declare
v_emp emp%Rowtype;
v_id number(4);
begin
select * into v_emp from emp where empno = 7900;
--proc1(salary=>1000,v_id,v_emp=>v_emp); error
proc1(1000,id=>v_id,v_emp=>v_emp); --ok
end;
--=====存储过程中的DDL语句------------
create or replace procedure proc1
is
begin
execute immediate 'create table test(c1 number)';
end;
--======Notice
--调用过程所需的权限
----调用过程时,所有角色都是disable的,即角色中包含的所有权都不能生效
----调用其他用户的过程,必须由过程的属主授予执行权限
----在过程中进行ddl操作,所需的权限必须通过直接授予的方式,不能通过角色授予
--查看Proc1过程的源文件
select text from user_source where name = 'PROC1';
--查看Proc1的状态
select object_type,status from user_objects where object_name = 'PROC1';
--重新编译proc1;
alter procedure proc1 compile;


  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-251523-1-1.html 上篇帖子: Oracle大数据常见优化查询 下篇帖子: Oracle与SQL2000常用函数对照
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表