您的位置:首页 > 其它

修改git全部已提交的用户名和邮箱

2015-06-03 14:44 253 查看
PLSQL提供了一个易于使用的,和SQL可以无缝连接的,健壮的,便携的,安全的服务器端的存储过程语言。你可以通过名称为PLSQL程序单元的程序模式对象来存取和操作数据库中的数据。
PLSQL程序单元是按照如下来分类的:
子程序是存放在数据库中的,可以被应用通过名称来调用的PLSQL块。你创建一个子程序时,数据库解析子程序,并把解析过的表达式存放在数据库中。你可以声明一个子程序为一个过程或者函数。

一个匿名的块是存在于应用中,但是没有被命名或者存储在database的PLSQL块。许多应用中,只要SQL声明出现的地方,PLSQL块都会出现。

PLSQL编译器和注释器都是嵌入在sql开发中,给予开发者在客户端和服务端上都有的一个连续的,杠杆式的开发模式。

PLSQL的存储过程,可以被一些database的客户端调用,比如说JDBC,ODBC,OCI。

PLSQL子程序是一个允许访客提供参数来进行输入,输出,或者输入输出参数的PLSQL块。
一个子程序解决一个特定的问题或者执行相关的任务,被当做一个模块化的,可维护的database应用的基础材料来服务。

一个子程序是一个程序或者函数。程序和函数的区别只有一个:函数会给访客返回一个值,procedure不会。Procedure在这里的术语意思是:过程或者函数。

PLSQL子程序的优势

服务端的程序比客户端的编程有很多优势。PLSQL子程序提供以下的优势:
提升的性能。

应用必须通过网络发送的数据量是很小的,和发布非独立的sql声明或者发送一个完整的PLSQL块给oracle DATABASE相比,因为这些信息只发送一次,使用的时候只会调用一次。

一个procedure的编译之后的结构在database中很容易就会可用,所以在执行的时候不会要求再编译

如果在SGA的共享池中的procedure是可用的话,database不会从disk中再检索它,而是直接执行它。

内存分配

因为存储过程比database中的共享内存更有优势,所以只会复制到内存一次来被多个用户来共享。共享的代码可以给应用需要的database的内存带来很显著的降低。

生产力的提升

存储过程提升开发的生产力。通过围绕一系列的procedure来设计应用,可以避免大量的编码。比如说,你要写procedure来操作A表。任何应用可以调用这些存储过程,不需要再编写存储过程。如果数据管理方法改变,只需要修改procedure,而不是操作procedure的应用。

存储过程是达到代码重用的最好的方法。因为任何语言编写的任何应用都可以调用存储过程,他们可以在所有环境中提供代码重复利用的最大化。

完整性

存储过程提供了用用的完整性和连续性,通过一些存储过程开发的应用可以减少代码错误。
例如:你可以测试一个子系统来保证这个子程序返回一个精确的值,确定之后,可以让其他的应用来调用它而不需要重新测试。如果procedure操作的数据结构改变之后,你只需要重新修改procedure。调用存储过程的应用不需要改动。

Procedure的定义者的安全性

存储过程可以帮助确保数据的额安全。定义者的权限的procedure执行的时候是按照它的拥有者的权限来界定,而不是当前使用者。所以,你可以通过只允许procedure和function来操作数据来限制数据库的操作。
比如,你可以限制grant 用户通过procedure来update一张表,而不是把表的权限赋予用户。用户调用飘柔车调度热的时候,他运行的权限是procedure的拥有者。用户只能调用存储过程来操作表里的数据,不能通过其他方式来操作表里的数据。

继承的权限和对象的环境对于调用者的权限procedure

调用者的权限过程执行的时候,拥有的是当前用户的权限。也就是说,调用者的权限不是被一个特定的用户或者对象绑定着的。调用者的权限让以应用为中心的逻辑实现起来更方面,即使当基本的数据被范散在用户的对象中。

比如,A用户在B表中运行一个update的过程,可以update薪水,C用户只能update地址的信息。

PLSQL子程序的创建

一个子程序可以通过create procedure 和create function 来创建,这是一个单独的存储子程序。定义在package里的子程序被称为package子程序,是package的一部分。Database把这些子程序存储在数据字典中,作为一个对象。
一个子程序有一个格式,包括任何参数的描述,还有主体。下面是创建一个单独的procedure,hire employees。这个过程的功能:向employees表中插入一行。

Create procedure hire_employees
(p_last_nameVARCHAR2, p_job_id VARCHAR2, p_manager_id NUMBER, p_hire_date DATE, p_salaryNUMBER, p_commission_pct NUMBER, p_department_id NUMBER)
IS
BEGIN . ..

INSERT INTO employees (employee_id, last_name,job_id, manager_id, hire_date, salary, commission_pct, department_id) VALUES(emp_sequence.NEXTVAL, p_last_name, p_job_id, p_manager_id, p_hire_date,p_salary, p_commission_pct, p_department_id);
END;

PLSQL子程序的执行
1:oracle工具:SQLPLUS或者sql develper
2:在应用代码中中明确的调用,
3:在另外一个procedure或者触发器中明确地调用。

有权限的用户用slqplus或者OEM来运行存储过程。
存储过程依赖于body内部的objects。Database自动追踪和管理这些从属关系。如果修改employees表的定义,会影响要操作这张表的存储过程,然后这些存储过程必须要重新编译来正常工作,通常database会自动管理从属关系。

PLSQLpackage
PLSQLpackage是一个包含cursors和使用的变量的子程序的集合,存放在database中作为被持续使用的一个单元。打包的子程序可以被应用或者用户直接调用。
Oracledatabase包含很多package,这些东西扩展了database的功能,提供了通向SQL特征的PLSQL路径。比如:UTL_HTTP包可以让HTTP从PLSQL调出数据来,通过Internet,或者调用oracle WEB 服务字体盒。你可以使用提供的包,在创建应用或者在创造你自己的存储过程时候作为一个idea。

优势:

封装:
Package可以把你的存储过程,变量,数据类型封装到一个命名的存储的单元中。
封装之后提供了更好的结构和便利。你可以创造格式和引用procedure不用创造package body。
封装让权限管理更加简单。赋予权限给一个包,让package的结构让用户可用。
数据安全:

确定变量,cursors和procedure的package定义方法是public或者Private。
Public意思是用户package直接可达的,private意思是对于用户的package是隐藏的。
例如:package可以包含10个过程。你可以直接定义package,所以只有三个是public的,因此执行的时候只有三个是可用的。只有package内部的procedure才能使用private的procedure。别把这里的public和private和package 变量中的grant to public混合起来。

更好的性能:

一个procedure第一次被调用的时候,一个全部的package会加载到内存中,加载在一个动作就结束了,而不是加载很多不同的procedure。当调用其他的package中的procedure发生,不需要其他的磁盘IO。

不需要影响package的格式,就能替换一个package的body。结果是:指向package的对象只会在package的格式修改之后重新编译。使用package,多余的编译就节省了,提升了性能。

创建oracle的package

可以通过两部分来创建package:格式和body。Package格式生命了所有的public 结构,body定义的是所有的结构(包括public,private)
下图:展示创建package的格式,封装了几个子程序来管理employee 表。

CREATEPACKAGE employees_management AS
FUNCTIONhire_employees (last_name VARCHAR2, job_id VARCHAR2, manager_id NUMBER, salaryNUMBER, commission_pct NUMBER, department_id NUMBER) RETURN NUMBER; PROCEDUREfire_employees(employee_id NUMBER);
PROCEDUREsalary_raise(employee_id NUMBER, salary_incr NUMBER); . . .

no_sal EXCEPTION;
END employees_management;

格式声明了函数:hire_employees,存储过程fire_employees,salary_raise,异常 no_sal。这些public程序对于可以通过package的用户都是可用的。

Createpackage body命令,定义的是格式中声明的对象。这些package body必须要在package中作为相同schama来创建,创建完package之后,你可以开发出调用public procedure或者function的应用。

PLSQL 匿名块

一个匿名块是一个未命名的,不持续的PLSQL块。匿名块的用户如下:

初始化调用子程序和package结构
孤立错误处理
使用嵌套其他的PLSQL块来管理控制。
匿名块并没有其他存储子程序的代码重用的优势,两种程序单元的区别:
子程序:有名字匿名块:没有
存放在database中,不存放
可以被其他应用调用,不可以
可以返回变量值可以返回变量值
可以返回函数值,不可以
可以接收参数不可以

匿名块包括一个声明部分,一个执行部分,和一个或者多个异常处理器。
下面的匿名块功能:从employees选择一个名字,传递给变量,然后打印出名字来。

DECLAREv_lname VARCHAR2(25);
BEGINSELECT last_name
INTO v_lname
FROM employees
WHERE employee_id = 101;
DBMS_OUTPUT.PUT_LINE('Employeelast name is '||v_lname); END;

Oracledatabase把PLSQL块编译之后放到SGA中的共享池中,但是并没有在database中存放源码或者编译之后的版本,不像是trigger,匿名块每次加载进入内存的时候都要编译一次,共享SQL允许PLSQL块在共享池中重用直到他们被共享池冲刷出去

PLSQL语言结构:
PLSQL块包含其他的PLSQL语言结构。这些结构如下:

变量和常量:
你可以通过procedure,function或者package来声明这些CONSTRUCTS。你可以使用一个变量或者常量提供需求。
游标:
你可以通过procedure,function,package来促进面向记录的处理数据来声明一个cursor。
PLSQL引擎也可以直接声明cursors。

本文出自 “原歌轩” 博客,请务必保留此出处http://yuangeqingtian.blog.51cto.com/6994701/1346523
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: