添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

oracle存储过程的定义者权限与调用者权限

当某个用户定义的存储过程由另一个用户调用时,需要指定存储过程的Definer(定义者权限 )与Invoker(调用者权限)。

一、存储过程的定义者权限

存储过程默认为该权限,也可以在定义存储过程的is|as之前添加authid definer参数,格式如下:

create [or replace] procedure 名称
[(参数1 in | out | in out 类型,
  参数2 in | out | in out 类型, ...)]
  authid definer
  is|as
    --变量声明区间
  begin
     --业务逻辑区间
  exception
     --异常处理
  end;

说明:如果一个存储过程的执行权限为定义者权限,则当另一个用户调用该存储过程时,和存储过程的所有者调用该存储过程是一样的(就相当于是存储过程的所有者调用了该存储过程)。

测试效果:

1、在scott用户下创建一张表t1,并输入数据
create table t1(
    id number(6) primary key,
    name varchar2(20),
    age number(2),
    phone varchar2(20)
SQL> select * from t1;
	ID NAME 		       AGE PHONE
---------- -------------------- ---------- --------------------
       101 JACK 			25 13603735588
       102 JERRY			21 13503736645
       103 TOM				32 13037350422
       104 ROSE 			28 13903732266
       105 MARK 			19 15903736633
       106 JIMMI			20 15037355066
6 rows selected.
2、在scott用户下创建一个存储过程,使用默认的definer权限,查看某个用户的姓名和电话
create or replace procedure sp_get_t1 (v_id number, v_name out varchar2, v_phone out varchar2) authid definer begin select name,phone into v_name,v_phone from t1 where id=v_id; exception when no_data_found then dbms_output.put_line('没有该用户信息!'); end; 15 / Procedure created.
3、查看该存储过程的信息

该存储过程的执行权限为DEFINER(定义者权限)。

SQL> select object_name,procedure_name,authid from user_procedures where object_name='SP_GET_T1';
OBJECT_NAME		       PROCEDURE_NAME	    AUTHID
------------------------------ -------------------- ------------
SP_GET_T1					                DEFINER
4、调用该存储过程
declare v_id t1.id%type; v_name t1.name%type; v_phone t1.phone%type; begin v_id:=&t1_id; sp_get_t1(v_id,v_name,v_phone); dbms_output.put_line( v_id||'用户的姓名:'||v_name|| ',电话:'||v_phone); end; 12 / Enter value for t1_id: 103 old 6: v_id:=&t1_id; new 6: v_id:=103; 103用户的姓名:TOM,电话:13037350422 PL/SQL procedure successfully completed.
5、创建一个用户JACK,在该用户下创建表t1,并输入数据
(1)创建用户JACK并授权
SQL> show user;
USER is "SYS"
create user JACK identified by JACK;
User created.
Elapsed: 00:00:00.09
Elapsed: 00:00:00.03
SQL> grant resource,connect to JACK;
Grant succeeded.
(2)以JACK用户身份登录,创建表t1并输入数据
SQL> show user;
USER is "JACK"
create table t1(
    id number(6) primary key,
    name varchar2(20),
    age number(2),
    phone varchar2(20)
  6  );
Table created.
SQL> select * from t1;
	ID NAME 		       AGE PHONE
---------- -------------------- ---------- --------------------
       101 张飞                         25 100801
       102 赵云                         21 200258
       103 关羽                         32 400125
6、以scott用户身份登录,把存储过程sp_get_t1的执行权限授予用户JACK
SQL> show user;
USER is "SCOTT"
SQL> grant execute on sp_get_t1 to JACK;
Grant succeeded.
7、以用户JACK身份登录,调用存储过程sp_get_t1并查看结果
SQL> show user;
USER is "JACK"
declare
    v_id t1.id%type;
    v_name t1.name%type;
    v_phone t1.phone%type;
begin
    v_id:=&t1_id;
    sp_get_t1(v_id,v_name,v_phone);
    dbms_output.put_line(
        v_id||'用户的姓名:'||v_name||
        ',电话:'||v_phone);
end;
 11   12  /
Enter value for t1_id: 103
old   6:     v_id:=&t1_id;
new   6:     v_id:=103;
103用户的姓名:TOM,电话:13037350422
PL/SQL procedure successfully completed.
此时发现,用户JACK调用存储过程sp_get_t1的输出结果和存储过程的定义者scott调用该存储过程的结果是完全相同的。

二、存储过程的调用者权限

可以在定义存储过程的is|as之前添加authid current_user参数,格式如下:

create [or replace] procedure 名称
[(参数1 in | out | in out 类型,
  参数2 in | out | in out 类型, ...)]
  authid current_user
  is|as
    --变量声明区间
  begin
     --业务逻辑区间
  exception
     --异常处理
  end;

说明:如果一个存储过程的执行权限为调用者权限,则当另一个用户调用该存储过程时,就相当于该用户自己创建了一个完全相同的存储过程。

测试效果:

1、在scott用户下创建一个存储过程,使用current_user权限,查看某个用户的姓名和电话
SQL> show user;
USER is "SCOTT"
create or replace procedure sp_get_t1_02
(v_id number,
 v_name out varchar2,
 v_phone out varchar2)
authid current_user
begin
    select name,phone into v_name,v_phone
    from t1
    where id=v_id;
exception
    when no_data_found then
       dbms_output.put_line('没有该用户信息!');
end;
 15  /
Procedure created.
2、查看该存储过程的信息

该存储过程的执行权限为CURRENT_USER(调用者权限)。

SQL> select object_name,procedure_name,authid from user_procedures 
where object_name='SP_GET_T1_02';
OBJECT_NAME		       PROCEDURE_NAME	    AUTHID
------------------------------ -------------------- ------------
SP_GET_T1_02					    CURRENT_USER
3、scott用户调用该存储过程
SQL> show user;
USER is "SCOTT"
declare
    v_id t1.id%type;
    v_name t1.name%type;
    v_phone t1.phone%type;
begin
    v_id:=&t1_id;
    sp_get_t1_02(v_id,v_name,v_phone);
    dbms_output.put_line(
        v_id||'用户的姓名:'||v_name||
        ',电话:'||v_phone);
end;
 12  /
Enter value for t1_id: 103
old   6:     v_id:=&t1_id;
new   6:     v_id:=103;
103用户的姓名:TOM,电话:13037350422
PL/SQL procedure successfully completed.
4、以scott用户身份登录,把存储过程sp_get_t1_02的执行权限授予用户JACK
SQL> show user;
USER is "SCOTT"
SQL> SQL> grant execute on sp_get_t1_02 to JACK;
Grant succeeded.
5、以用户JACK身份登录,调用存储过程sp_get_t1_02并查看结果
SQL> show user;
USER is "JACK"
declare
    v_id t1.id%type;
    v_name t1.name%type;
    v_phone t1.phone%type;
begin
    v_id:=&t1_id;
    scott.sp_get_t1_02(v_id,v_name,v_phone);
    dbms_output.put_line(
        v_id||'用户的姓名:'||v_name||
        ',电话:'||v_phone);
end;
 12  /
Enter value for t1_id: 103
old   6:     v_id:=&t1_id;
new   6:     v_id:=103;
103用户的姓名:关羽,电话:400125
PL/SQL procedure successfully completed.
此时发现,用户JACK调用存储过程sp_get_t1_02,就像自己编写了一个存储过程,调用的是自己的t1表。
四、查看存储过程信息
1、查看当前用户所定义的所有存储过程的名称
SQL> select object_name,procedure_name,object_type,deterministic,authid from user_procedures;
OBJECT_NAME		       PROCEDURE_NAME	    OBJECT_TYPE 	DET AUTHID
------------------------------ -------------------- ------------------- --- ------------
SP_EMP_INSERT				    PROCEDURE		NO  DEFINER
SP_SET_EMP_SAL				    PROCEDURE		NO  DEFINER
SP_DISP 					    PROCEDURE		NO  DEFINER
SP_CIRCLE_AREA				    PROCEDURE		NO  DEFINER
SP_UPDATE_EMP_SAL			    PROCEDURE		NO  DEFINER
SP_GET_EMP					    PROCEDURE		NO  DEFINER
SP_UPDATE_EMP_SAL_01		    PROCEDURE		NO  DEFINER
SP_INSERT_T01_FORALL		    PROCEDURE		NO  DEFINER
SP_SCORE_GRADE				    PROCEDURE		NO  DEFINER
SP_DELETE_T1_FORALL			    PROCEDURE		NO  DEFINER
SP_INSERT_T01_FORALL02		    PROCEDURE		NO  DEFINER
SP_UPDATE_T1_FORALL			    PROCEDURE		NO  DEFINER
SP_INSERT_T01				    PROCEDURE		NO  DEFINER
SP_UPDATE_EMP_BULK			    PROCEDURE		NO  DEFINER
SP_UPDATE_T01_FORALL		    PROCEDURE		NO  DEFINER
SP_EMP_ENAME_DEPT			    PROCEDURE		NO  DEFINER
SP_EMP_DEPTNO11 			    PROCEDURE		NO  DEFINER
SP_EMP_DEPTNO				    PROCEDURE		NO  DEFINER
SP_FETCH_EMP				    PROCEDURE		NO  DEFINER
PS_ADD						    PROCEDURE		NO  DEFINER
SP_ADD						    PROCEDURE		NO  DEFINER
SET_SAL 					    PROCEDURE		NO  DEFINER
GET_EMP 					    PROCEDURE		NO  DEFINER
TEST_CREATE					    PROCEDURE		NO  DEFINER
UPDATE_SAL					    PROCEDURE		NO  DEFINER
ADD_SAL 					    PROCEDURE		NO  DEFINER
26 rows selected.
2、查看存储过程的参数信息
SQL> desc get_emp;
PROCEDURE get_emp
 Argument Name			Type			In/Out Default?
 ------------------------------ ----------------------- ------ --------
 P_EMPNO			NUMBER			IN
 V_ENAME			VARCHAR2		OUT
 V_SAL				NUMBER			OUT
3、查看某个存储过程的代码
SQL> select text from user_source where name='SP_UPDATE_EMP_SAL';
--------------------------------------------------------------------------------
procedure sp_update_emp_sal
    type t_table_emp is table of emp%rowtype
    index by binary_integer;
    v_table_emp t_table_emp;
begin
    update emp set sal=sal*1.1 where deptno=10;
    select * bulk collect into v_table_emp from emp where deptno=10;
    for i in v_table_emp.first..v_table_emp.last loop
        dbms_output.put_line('雇员编号:'||v_table_emp(i).empno||
               ',  姓名:'||v_table_emp(i).ename||
               ',  工资:'||v_table_emp(i).sal);
    end loop;
end;
14 rows selected.

五、存储过程应用举例

1、无参数存储过程

把emp表10部分所有人的工资增加10%,并且显示员工编号、姓名及工资信息。

create or replace procedure sp_update_emp_sal type t_table_emp is table of emp%rowtype index by binary_integer; v_table_emp t_table_emp; begin update emp set sal=sal*1.1 where deptno=10; select * bulk collect into v_table_emp from emp where deptno=10; for i in v_table_emp.first..v_table_emp.last loop dbms_output.put_line('雇员编号:'||v_table_emp(i).empno|| ', 姓名:'||v_table_emp(i).ename|| ', 工资:'||v_table_emp(i).sal); end loop; end; Procedure created.

运行存储过程,结果如下:

SQL> call sp_update_emp_sal();
雇员编号:7934,  姓名:MILLER,  工资:1574.21
雇员编号:7782,  姓名:CLARK,  工资:2965.71
雇员编号:7839,  姓名:KING,  工资:6051.21
Call completed.
注意:无参数存储过程调用时要加一对空括号。
2、带输入参数的存储过程

对上例的存储过程进行修改,通过指定一个输入参数,用户在调用时指定某个部门,则把该部门员工的工资增加10%,并显示该部门员工的工号、姓名和工资。代码如下:

create or replace procedure sp_update_emp_sal_01 (v_deptno number) type t_table_emp is table of emp%rowtype index by binary_integer; v_table_emp t_table_emp; begin update emp set sal=sal*1.1 where deptno=v_deptno; select * bulk collect into v_table_emp from emp where deptno=v_deptno; for i in v_table_emp.first..v_table_emp.last loop dbms_output.put_line('雇员编号:'||v_table_emp(i).empno|| ', 姓名:'||v_table_emp(i).ename|| ', 工资:'||v_table_emp(i).sal); end loop; end; Procedure created.

调用时指定20部门作为参数,查询结果如下:

SQL> call sp_update_emp_sal_01(20);
雇员编号:7788,  姓名:SCOTT,  工资:2423.63
雇员编号:7876,  姓名:ADAMS,  工资:1334.63
雇员编号:7566,  姓名:JONES,  工资:3603.38
雇员编号:7902,  姓名:FORD,  工资:3633.63
雇员编号:7369,  姓名:SMITH,  工资:971.63
Call completed.
3、指定输出参数

输入一个圆的半径,求圆的面积,代码如下:

create or replace procedure sp_circle_area (v_radius in number,area out number) begin area:=3.1415926*power(v_radius,2); end; Procedure created.

在代码块中调用该该存储过程,结果如下:

declare v_area number(15,8); begin sp_circle_area(4,v_area); dbms_output.put_line('圆的面积为:'||v_area); end; 圆的面积为:50.2654816 PL/SQL procedure successfully completed.
4、综合练习

为emp插入一条新记录:

(1)创建一个序列seq_emp,从9001开始编号
SQL> create sequence seq_emp start with 9001;
Sequence created.
(2)创建一个存储过程sp_emp_insert
create or replace procedure sp_emp_insert
(v_ename varchar2,
 v_job varchar2 default 'SALESMAN',
 v_mgr number default 7698,
 v_hiredate date default sysdate,
 v_sal number default 2000,
 v_comm number default 0,
 v_deptno number default 40)
begin
    insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno)
    values(seq_emp.nextval,
           v_ename,
           v_job,
           v_mgr,
           v_hiredate,
           v_sal,
           v_comm,
           v_deptno);
end;

执行存储过程:

SQL> call sp_emp_insert('Jerry');
Call completed.
Elapsed: 00:00:00.02
SQL> call sp_emp_insert('John',v_sal=>1800);
Call completed.
Elapsed: 00:00:00.00
SQL> call sp_emp_insert('Merry',v_hiredate=>sysdate-10,v_sal=>2100);
Call completed.
Elapsed: 00:00:00.01
SQL> select * from emp where empno>9000;
     EMPNO ENAME      JOB	       MGR HIREDATE		      SAL	COMM	 DEPTNO
---------- ---------- --------- ---------- ------------------- ---------- ---------- ------
      9001 Jerry      SALESMAN	      7698 2020-02-17 01:01:22	     2000	   0	     40
      9002 John       SALESMAN	      7698 2020-02-17 01:02:39	     1800	   0	     40
      9003 Merry      SALESMAN	      7698 2020-02-07 01:03:40	     2100	   0	     40
                    oracle存储过程的定义者权限与调用者权限当某个用户定义的存储过程由另一个用户调用时,需要指定存储过程的Definer(定义者权限 )与Invoker(调用者权限)。一、存储过程的定义者权限存储过程默认为该权限,也可以在定义存储过程的is|as之前添加authid definer参数,格式如下:create [or replace] procedure 名称[(参数1 in | out...
原书名: Oracle Database 11g, A Beginner's Guide
原出版社: McGraw-Hill Osborne Media
作者: (美)Ian Abramson    Michael Abbey    Michael Corey
译者: 窦朝晖
出版社:清华大学出版社
ISBN:9787302218937
上架时间:2010-2-20
出版日期:2010 年1月
开本:16开
页码:288
版次:1-1
  本书能使读者快捷地掌握oracle database 11g的基础知识。通过自我评估教程,介绍了核心数据库技术、管理员职责、高可用性以及大型数据库特性。本书带领读者循序渐进地学习数据库设置、管理、编程、备份和恢复。还深入介绍了sql和pl/sql。为了易于学习,这本独特的oracle press指南是这样组织的:
   ·核心概念——oracle database 11g主题呈现在按逻辑组织的章节中
   ·主要内容——每章要介绍的具体内容列表
   ·实践练习——演示如何应用在每章学到的关键技术
   ·学习效果测试——对学习效果的快速自我评估
   ·注意——与所介绍主题相关的额外信息
   ·章节测验——每章结束时的测验测试读者对所学知识的掌握程度 
  Ian Abramson是IOUG(Independent Oracle Users Group)现任总裁,现居加拿大多伦多,他是业界资深技术顾问,为电信、CRM、公用事业和其他行业的客户提供实现方案的专业指导。他的关注方向包括Oracle产品集,以及其他前沿技术和这些技术在优化数据仓库设计和部署的应用。他还是各种技术会议的主讲人,包括COLLABORATE、Oracle OpenWorld和其他地方与区域会议。
  Michael Abbey是公认的数据库管理、安装、开发、应用迁移、性能调优和实现方面的权威。在过去的14年中,他与IanAbramson和MichaelCorey为OraclePress合著了一系列图书.Abbey在国际Oracle用户团体非常活跃,经常出席COLLABORATE、OraclecOpenWorld和区域性用户组会议.
  Michael J.Corey是Ntirety(ThecDatabasecAdministrationcExperts)的创始人和CEO.Michael的数据库情结可追溯到Oraclec3.0.Michael是IOUG(www.ioug.org)的前总裁和早期的Oraclec Press作者.他经常在世界各地的商业和技术会议上进行学术交流.他的博客是http://michaelcorey.ntirety.com
  Michelle Malcher是一名高级数据库管理员,在数据库开发、设计和管理方面具有十多年经验.她是性能调优、安全、数据建模和超大型数据库环境数据库体系结构方面的专家.她是IOUG Best Practices Tip Booklet的特约作者.Michelle积极参加IOUG活动,是特殊兴趣组的负责人.在技术会议和用户组会议上她乐于展现和分享有关Oracle数据库主题的思想.她的Email是michelle_malcher@ioug.org.
封面 -14
封底 -13
扉页 -12
版权 -11
关于作者 -10
前言 -8
目录 -5
第1章  数据库基础 1
 1.1  数据库定义 2
 1.2  Oracle Database 11g的体系结构 3
  1.2.1  控制文件 4
  1.2.2  联机重做日志 4
  1.2.3  System表空间 4
  1.2.4  Sysaux表空间 4
  1.2.5  默认的临时表空间 5
  1.2.6  Undo表空间 5
  1.2.7  服务器参数文件 5
  1.2.8  后台进程 5
  1.2.9  数据库管理员 7
 1.3  Oracle Database 11g的基本数据类型 8
  1.3.1  varchar2 8
  1.3.2  数字 9
  1.3.3  日期 9
  1.3.4  时间戳 9
  1.3.5  clob 10
  1.3.6  blob 10
 1.4  表 10
 1.5  存储对象 11
  1.5.1  视图 12
  1.5.2  触发器 12
  1.5.3  过程 13
  1.5.4  函数 13
				
Oracle Database 11g初学者指南》能使读者快捷地掌握Oracle Database 11g的基础知识。通过自我评估教程,介绍了核心数据库技术、管理员职责、高可用性以及大型数据库特性。《Oracle Database 11g初学者指南》带领读者循序渐进地学习数据库设置、管理、编程、备份和恢复。还深入介绍了SQL和PL/SQL。为了易于学习,这本独特的Oracle Press指南是这样组织的: 核心概念——Oracle Database 11g主题呈现在按逻辑组织的章节中 主要内容——每章要介绍的具体内容列表 实践练习——演示如何应用在每章学到的关键技术 学习效果测试——对学习效果的快速自我评估 注意——与所介绍主题相关的额外信息 章节测验——每章结束时的测验测试读者对所学知识的掌握程度。 第1章 数据库基础 1.1 数据库定义 1.2 Ofacle Database 11g的体系结构 1.2.1 控制文件 1.2.2 联机重做日志 1.2.3 System表空间 1.2.4 Sysaux表空间 1.2.5 默认的临时表空间 1.2.6 Undo表空间 1.2.7 服务器参数文件 1.2.8 后台进程 1.2.9 数据库管理员 1.3 Oracle Database 11g的基本数据类型 1.3.1 varchar2 1.3.2 数字 1.3.3 日期 1.3.4 时间戳 1.3.5 clob 1.3.6 blob 1.4 表 1.5 存储对象 1.5.1 视图 1.5.2 触发器 1.5.3 过程 1.5.4 函数 1.5.5 包 1.6 Oracle Database 11g的其他重要内容 1.6.1 索引 1.6.2 用户 1.6.3 表空间配额 1.6.4 同义词 1.6.5 角色 1.6.6 默认用户环境 1.7 对象和系统权限 1.7.1 select 1.7.2 insen 1.7.3 update 1.7.4 delete 1.7.5 系统权限 1.8 网格 1.9 综述 1.10 本章测验 第2章 Oracle安装 2.1 安装研究和安装计划 2.1.1 确定系统需求 2.1.2 Linux安装 2.2 操作系统设置 2.3 Linux简介 2.4 选择安装组件 2.5 安装Oracle软件 2.5.1 数据库配置助手 2.5.2 验证安装 2.6 综述 2.7 本章测验 第3章 OFacle网络连接 3.1 使用Omcle Net Services 3.1.1 网络协议 3.1.2 优化网络带宽 3.1.3 连接 3.1.4 保持连接 3.1.5 定义一个位置 3.2 专用和共享服务器体系结构之间的差别 3.2.1 专用服务器 3.2.2 共享服务器 3.2.3 设置分派进程 3.2.4 监视共享服务器的视图 3.3 定义连接 3.3.1 连接描述符 3.3.2 定义连接描述符 3.3.3 Oracle连接管理器 3.3.4 会话多路复用 3.3.5 防火墙访问控制 3.4 使用Oracle Net Listener 3.4.1 密码验证 3.4.2 多个监听进程 3.4.3 连接池 3.5 命名方法 3.5.1 目录命名方法 3.5.2 目录信息树 3.5.3 标识名 3.5.4 如何查找目录命名信息 3.5.5 网络服务别名条目 3.5.6 本地命名方法 3.5.7 简单命名方法 3.5.8 外部命名方法 3.5.9 使用哪种命名方法 3.6 使用Oracle配置文件 3.7 使用管理工具 3.7.1 OEM/网格控件 3.7.2 Oracle网络管理器 3.7.3 OEM控制台 3.7.4 OEM组件 3.7.5 Oracle网络配置助手 3.7.6 Oracle网络目录配置助手 3.7.7 命令行实用程序 3.7.8 Oracle高级安全选项 3.7.9 分派进程 3.8 使用配置文件 3.9 多层环境中的网络 3.10 安装Oracle 11g客户端软件 3.11 本章测验 第4章 SQL:结构化查询语言 4.1 SOL语句的组成 4.1.1 DDL 4.1.2 DML 4.2 基本的insert和select语句 4.2.1 insert 4.2.2 select 4.3 简单的where子句 4.3.1 带and/or的where子句 4.3.2 带NOT的where子句 4.3.3 带搜索范围的where子句 4.3.4 带搜索列表的where子句 4.3.5 带模式搜索的where子句 4.3.6 where子句中的常用操作符 4.4 基本的update和delete语句 4.4.1 update语句 4.4.2 delete语句 4.5 数据排序 4.6 函数:字符串函数、数字函数和聚集函数(不是分组) 4.6.1 字符串函数 4.6.2 数字函数 4.6.3 聚集函数 4.7 日期函数(格式化的和按时间排列的) 4.7.1 日期函数 4.7.2 特殊格式的日期数据类型 4.7.3 嵌套函数 4.8 连接(ANSI与Oracle对比):内连接、外连接、自连接 4.8.1 内连接 4.8.2 外连接 4.8.3 自连接 4.9 groupby和having子句 4.9.1 groupby 4.9.2 having 4.10 子查询:简单子查询和带连接的相关比较 4.10.1 简单子查询 4.10.2 带连接的相关子查询 4.11 集合操作符:union、intersect和minus 4.11.1 union 4.11.2 union all 4.11.3 intersect 4.11.4 minus 4.12 视图 4.13 序列 4.14 约束:与实体模型的联系、类型、延迟 4.14.1 与实体模型的联系 4.14.2 类型 4.14.3 延迟 4.15 用SQL*Plus进行格式化输出 4.15.1 页和行大小 4.15.2 页标题 4.15.3 页脚 4.15.4 格式化列 4.15.5 将SQL*Plus输出结果写入文件 4.16 本章 测验 第5章 PL/SQL 5.1 PL/SQL定义和使用PL/SQL的原因 5.2 基本PL/SQL编程结构 5.3 定义PL/SQL数据类型 5.3.1 有效字符集 5.3.2 算术操作符 5.3.3 varchar2类型 5.3.4 数字类型 5.3.5 日期类型 5.3.6 布尔类型 5.4 在SQL*Plus中编写PL/SQL程序, 5.4.1 PL/SQL程序中的SQL 5.4.2 PL/SQL游标 5.4.3 游标For循环 5.5 PL/SQL中的异常处理 5.6 程序中的控制结构 5.6.1 程序控制 5.6.2 IF逻辑结构 5.6.3 CASE语句 5.6.4 Loop循环 5.6.5 WHILE循环 5.6.6 FOR循环 5.7 如何创建存储过程以及创建存储过程的原因 5.8 函数的创建和使用 5.9 调用PL/SQL程序 5.10 本章 测验 第6章 数据库管理员 6.1 了解DBA的工作 6.2 执行日常操作 6.2.1 体系结构和设计 6.2.2 容量规划 6.2.3 备份和恢复 6.2.4 安全 6.2.5 性能和调整 6.2.6 管理数据库对象 6.2.7 存储管理 6.2.8 变化管理 6.2.9 任务调度 6.2.1 0网络管理 6.2.1 1故障排查 6.3 OracleDatabase11g的基础结构 6.3.1 模式 6.3.2 存储结构 6.4 OracleDatabase11g的操作模式 6.4.1 操作模式 6.4.2 数据库和实例关闭 6.5 0EM使用初步 6.5.1 实例配置 6.5.2 用户会话 6.5.3 资源消费者组 6.5.4 模式、安全和存储管理 6.5.5 分布式管理 6.5.6 数据仓库特征 6.5.7 其他工具 6.6 数据库对象管理 6.6.1 控制文件 6.6.2 重做日志 6.6.3 撤消管理 6.6.4 模式对象 6.7 空间管理 6.7.1 归档日志 6.7.2 表空间和数据文件 6.8 用户管理 6.8.1 创建用户 6.8.2 编辑用户 6.9 数据库用户权限管理 6.9.1 授权 6.9.2 角色 6.9.3 配置文件 6.9.4 综述 6.10 本章 测验 第7章 备份与恢复 7.1 Oracle备份和恢复基本原理 7.1.1 从何处着手 7.1.2 备份的体系结构 7.1.3 Oracle二进制文件 7.1.4 参数文件 7.1.5 控制文件 7.1.6 重做日志 7.1.7 撤消段 7.1.8 检查点 7.1.9 归档日志 7.1.10 数据文件、表空间、段、分区和块 7.1.11 转储文件 7.2 0racle用户管理的备份和恢复 7.2.1 用户管理的备份类型 7.2.2 冷备份 7.2.3 热备份 7.2.4 从冷备份中恢复 7.2.5 从热备份中恢复 7.2.6 恢复的7个步骤 7.2.7 用备份控制文件进行恢复 7.3 编写数据库备份脚本 7.4 备份归档重做日志 7.5 Oracle Data Pump简介 第8章 高可用性:RAC、ASM和Data Guand 第9章 大型数据库特性 附录 各章测验答案
在编写PLSQL程序时,对于授权的考虑很重要。ORACLE PLSQL中提供两种授权选择: --AUTHID DEFINER (定义权限):指编译存储对象的所有者。也是默认权限模式。 --AUTHID CURREN...
数据库当前用户授予了connect、resource权限,在存储过程里面执行execute immediate 'create table XX'时会报“权限不足”的错误。此时觉得很奇怪,resource角色是具有create table的权限的,为什么在存储过程里面创建表就权限不足了。     查了资料,原因为:用户拥有的角色role在存储过程里面不可用。 一般有如下两种解决方法:
Oracle存储过程执行权限 默认情况下,在调用存储过程用户的角色是不起作用的,即在执行存储过程时只有Public权限。所以如果被调用的存储过程中如果有executeimmediate 'create table..'语句,将会引发ORA-01031:insufficient privileges错误。 存储过程分为两种,即DR(Definer'sRights ) Procedur...
Oracle使用EXECUTE IMMEDIATE命令动态执行SQL语句 动态执行SQL语句指先把一个SQL命令保存到一个字符串中,然后通过execute immediate命令动态执行字符串中的SQL语句,以实现SQL语句的动态生成。 一、动态SQL语句的使用方式 DECLARE 字符串变量名 varchar2(n); --定义一个字符串类型的变量,用以保存SQL语句 BE...
Oracle变量的定义和使用 Oracle提供了三种定义变量的方式,分别为:使用define定义HOST变量,使用Variable定义绑定变量,在代码块的declare中定义变量。 一、使用define定义HOST变量 使用define定义host变量时须指定变量名和变量的值,如果变量名已存在于host变量中,则自动覆盖。定义host变量时不能指定类型,一律按char存储。DEFINE变量只在当前...
Oracle代码块(1)——匿名代码块 Oracle的流程控制语句必须在代码块中执行。代码块分为两种:命名块和匿名块。 匿名代码块:以DECLARE或BEGIN开始,每次提交都被编译。匿名块因为没有名称,所以不能在数据库中存储并且不能直接从其他PL/SQL块中调用。 命名代码块:包括存储过程、函数、包和触发器。命名代码块可以在数据库中存储并在适当的时候调用。 一、定义Oracle匿名代码块 在代码...
Oracle Sqlplus 设置数据显示的行数、行宽等 在使用 Oracle Sqlplus 对数据库进行操作时,通过设置数据显示的行数、行宽以及某些列的显示宽度,可以使数据的显示更加美观。 一、设置页面显示的行数(pagesize) 1、查看 pagesize 的当前值 SQL> show pagesize pagesize 100 2、设置页面显示的行数并查看效果 SQL> set pagesize 8; SQL> select empno,ename,job,sal from e
[oracle@CentOS-Oracle database]$ ./runInstaller -ignorePrereq -silent -responseFile /tmp/oracle/database/response/db_install.rsp 正在启动 Oracle Universal Installer... 检查临时空间: 必须大于 120 MB。 实际为 24804 MB...
Oracle逻辑备份与恢复(exp | imp)命令详解 逻辑备份是指从数据库中导出数据并写入一个输出文件。逻辑备份只能用来对数据库进行逻辑恢复,即数据导入,而不能按数据库原来的存储特征进行物理恢复。逻辑备份可以使用exp命令来完成,逻辑导入可以使用imp命令来完成。exp和imp命令的用法如下: 一、使用exp命令进行数据备份 该命令的常用参数如下: 1、USERID:指定用户名和口令,格式为:...
在调用Oracle存储过程时,经常会遇到一些错误。以下是一些常见的错误和解决方法: 1. ORA-06550: line 1, column 7: PLS-00306: wrong number or types of arguments in call to 'PROCEDURE_NAME' 这个错误通常是由于传递的参数类型或数量与存储过程定义不匹配引起的。请检查你的参数是否与存储过程定义中的参数相匹配。 2. ORA-04068: existing state of packages has been discarded 这个错误通常是由于在执行存储过程之前,先执行了某些DDL语句,导致存储过程的状态被丢弃。请确保在执行存储过程之前不要执行任何DDL语句。 3. ORA-06508: PL/SQL: could not find program unit being called 这个错误通常是由于存储过程不存在或者没有正确授权给调用者。请确保存储过程存在,并且调用者有执行该存储过程权限。 如果你使用Mybatis调用Oracle存储过程时出现错误,也可以按照上述方法进行排查。同时,你还需要确保Mybatis的配置文件中正确配置了存储过程的参数和返回值。