`

Oracle数据库之PLSQL过程

阅读更多
--============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;



 

分享到:
评论

相关推荐

    PLSQL Developer7(oracle数据库)

    PLSQL Developer7(oracle数据库) PLSQL Developer7(oracle数据库) PLSQL Developer7(oracle数据库) PLSQL Developer7(oracle数据库) PLSQL Developer7(oracle数据库) PLSQL Developer7(oracle数据库) ...

    oracle 数据库 plsql 存储过程

    ### Oracle数据库PL/SQL存储过程详解 #### 一、存储过程概述 **Oracle存储过程**是一种可以在Oracle数据库中存储并可被多次调用的PL/SQL代码块。它由一系列的PL/SQL语句组成,可以包含控制流程、变量声明等,能够...

    基于oracle数据库的PLSQL编程以及存储过程的创建和使用资料.zip

    通过深入学习和实践这些内容,开发者能够熟练掌握在Oracle数据库中使用PLSQL进行编程,并能有效地创建和管理存储过程,以提高数据库应用的效率和质量。在实际工作中,了解这些知识点对于数据库管理和开发工作至关...

    Oracle数据库plsql客户端

    PL/SQL是Oracle数据库特有的编程语言,结合了SQL查询和过程式编程的特点。它是开发数据库应用、实现业务逻辑的关键工具,具有异常处理、循环、子程序等功能,使得数据库操作更加高效和安全。 3. 中文版本: 提供...

    有JavaWEB的网上商城系统源码+项目说明(SSM框架、Shiro技术、Oracle数据库、PLSQL编程).zip

    有JavaWEB的网上商城系统源码+项目说明(SSM框架、Shiro技术、Oracle数据库、PLSQL编程、JSP、JQuery、Ajax、Jso).zip 有JavaWEB的网上商城系统源码+项目说明(SSM框架、Shiro技术、Oracle数据库、PLSQL编程、JSP、...

    Oracle数据库连接工具PLSQL轻桌面工具包

    Oracle数据库连接工具PLSQL轻桌面工具包,安装PLSQL必须下载轻桌面工具包

    Oracle数据库培训-PLSQL编程

    Oracle数据库培训-PLSQL编程

    oracle数据库和plsql语法练习

    "Oracle数据库练习PPT"可能包含一系列关于Oracle数据库管理、表的创建、索引、视图、触发器、存储过程、游标以及数据库安全等内容的教程。通过这些PPT,初学者可以了解到如何设计和操作Oracle数据库,包括数据类型、...

    PlSQL安装包:用于连接Oracle的工具

    PlSQL Developer是一款强大的集成开发环境,专门用于编写和管理Oracle数据库的PL/SQL代码。它为Oracle数据库管理员、开发人员和分析师提供了全面的功能,简化了与Oracle数据库的交互过程。这款软件是Allround ...

    oracle客户端(plsql developer连接远程数据库)

    plsql developer连接远程数据库(本地不用安oracle)

    oracle数据库利用plsql提取(导出).doc

    - **PL/SQL**:PL/SQL(Procedure Language for SQL)是一种过程化语言,专为提高Oracle数据库应用程序开发者的生产力而设计。它将SQL命令与传统过程化控制流语句相结合,能够提高数据库应用程序的性能,并简化其维护...

    使用PLSQL 创建Oracle数据库用户并设置权限

    "使用PLSQL创建Oracle数据库用户并设置权限" 在 Oracle 数据库中,创建用户并设置权限是数据库管理员的基本任务之一。在本文中,我们将使用 PLSQL 创建 Oracle 数据库用户并设置权限,包括创建用户、设置权限和创建...

    用plsql将mdb文件导入到oracle数据库中

    本文旨在详细介绍如何使用PL/SQL将MDB文件(Microsoft Access数据库)导入到Oracle数据库中的过程及相关技术点。 ### 一、概述 标题与描述都明确指出了本篇文章的核心内容:利用PL/SQL进行MDB文件向Oracle数据库的...

    使用plsqldev对oracle数据库做备份还原操作

    在Oracle数据库管理中,PL/SQL Developer是一款非常实用的工具,它专为Oracle数据库的存储程序单元开发设计,包括过程、函数、包、触发器等的编写和调试。这款工具以其用户友好、代码质量优化以及高生产力而受到青睐...

    ORACLE数据库的PLSQL程序设计

    oracle数据库系统的好工具,plsql程序设计,内容详尽,适合初学者,步骤详细,是一份难能可贵的资料,我找了很久的,现在共享给大家

    plsqlDev链接Oracle数据库使用

    plsqlDev链接Oracle数据库使用plsqlDev链接Oracle数据库使用plsqlDev链接Oracle数据库使用

    PLSQL语法Oracle数据库

    PLSQL语法Oracle数据库

    plsql 连接oracle数据库工具

    其中,"plsql"通常指的是Oracle的PL/SQL Developer,这是一个强大的第三方工具,专为开发和管理Oracle数据库的PL/SQL代码而设计。它提供了代码编辑、调试、数据库对象浏览、版本控制等多种功能,极大提高了开发效率...

    大型数据库系统技术课程 Oracle数据库OceanBase数据库知识教程 PLSQL介绍全部课程PPT课件共12个章节.rar

    2-2-Oracle数据库知识 PLSQL介绍 共69页.ppt 3-1-Oracle数据库知识 PLSQL控制结构 共25页.ppt 4-1-异常处理 共87页.ppt 4-2-过程与函数 共62页.ppt 4-3-在PLSql中使用sql 共98页.ppt 5-1-DistributedDatabaseSystem...

    PLSQL_oracle数据库

    Oracle数据库是世界上最广泛使用的商业关系型数据库系统之一,以其稳定性、安全性和可扩展性而著称。 在"PLSQLDeveloper_win32位"中,我们关注的是一个专门用于开发PLSQL代码的集成开发环境(IDE),即PL/SQL ...

Global site tag (gtag.js) - Google Analytics