刚毕业找工作时,数据库方面被问的较多的一个问题,现在才对这个概念有真正的接触,学习小结一下。
将常用的或很复杂的工作,预先用SQL语句写好并用一个指定的名称存储起来, 那么以后要叫数据库提供与已定义好的存储过程的功能相同的服务时,只需调用execute,即可自动完成命令。
使用存储过程而非SQL语句的原因是:
存储过程通常会使性能增加,存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,并对其进行缓存以备将来重用。
在数据库中,存储过程可分别得到保护。客户可以被给予执行某个存储过程的权限,但无权处理底层的表。
存储过程将导致维护简单,因为在一个已部署组件内,修改存储过程通常要比修改硬编码的SQL语句简单。存储过程可以重复使用,可减少数据库开发人员的工作量。
存储过程可以降低网络流量,因为SQL语句可以以批处理的方式执行,而不是从客户端发送多个请求。
定义存储过程
CREATE[OR REPLACE] PROCEDURE[schema.] procedure_name
[(argument[{IN|OUT|IN OUT}]datatype|,...|)]
{IS | AS}
pl/sql_body;
其中,procedure_name是存储过程的名称,argument是参数名,datatype是对应参数的数据类型。OR REPLACE是可选项,如果已经存在一个同名的过程,则首先删除已有过程,然后创建。关键字IS和AS是等价的,用来引出过程体。
下面是一个PL/SQL下写的存储过程
CREATE OR REPLACE PROCEDURE PA_REMOTE_LOAD(M_CODE IN NUMBER)
IS
BEGIN
DELETE FROM ECC_URL;
insert into ecc_url
(pc_code, url)
SELECT PC,URL FROM ECC_URL_MODEL WHERE MODEL_CODE=M_CODE;
COMMIT;
END;