




已阅读5页,还剩137页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实用数据库技术,第7章 Oracle10g数据库管理系统,学习内容,Oracle 概述 Oracle 10g数据库安装 Oracle 10g数据库卸载 Oracle 10g常用管理工具 Oracle10g表管理 使用过程和触发器,Oracle 概述,Oracle公司 Oracle数据库,Oracle 10g数据库安装,服务器安装需求 版本 企业版 标准版 个人版 最低配置 CPU:Pentium 166 内存:128MB 硬盘空间:企业版(176GB):标准版(176GB):个人版(172GB) 视频:256色,Oracle 10g数据库安装,客户端安装需求 安装类型 管理者(administrator) 运行时环境(runtime) 自定义(custom) 最低配置 CPU:Pentium 166 内存:128MB 硬盘空间:管理者(647MB):运行时环境(486MB),Oracle 10g数据库安装过程,(略),Oracle 数据库卸载,1、停止服务 2、卸载Oracle产品 3、清理注册表 4、清理环境变量 5、清理磁盘,Oracle卸载 1/5,开始设置控制面板管理工具服务停止所有Oracle服务,Oracle卸载 2/5,开始程序Oracle Installation Products Universal Installer 卸装所有Oracle产品,但Universal Installer本身不能被删除,Oracle卸载 3/5,运行regedit HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServices 滚动这个列表,删除所有Oracle入口。 HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesEventlogApplication,除所有Oracle入口。,Oracle卸载 4/5,开始设置控制面板系统高级环境变量 删除环境变量CLASSPATH和PATH中有关Oracle的设定,Oracle卸载 5/5,从桌面上、STARTUP(启动)组、程序菜单中,删除所有有关Oracle的组和图标 删除Program FilesOracle目录 重新启动计算机,重起后才能完全删除Oracle所在目录, 删除与Oracle有关的文件,选择Oracle所在的缺省目录C:Oracle,删除这个入 口目录及所有子目录,并从Windows 2000目录(一般为C:WINNT)下删除以下文件ORACLE.INI、oraodbc.ini等等。,Oracle10g常用管理工具,OEM控制台 SQL*PLUS工具介绍,Oracle10g表管理,在Oracle中建表,主要有两种方式: 一种是在SQL*PLUS中执行建表的SQL语句。 另一种是通过OEM工具。,Oracle10g数据中的数据类型,PL/SQL语言基础,注释 变量声明 运算符 PL/SQL块结构 控制语句,PL/SQL 程序设计简介,PL /SQL是一种高级数据库程序设计语言,该语言专门用于在各种环境下对ORACLE数据库进行访问。由于该语言集成于数据库服务器中,所以PL/SQL代码可以对数据进行快速高效的处理。除此之外,可以在ORACLE数据库的某些客户端工具中,使用PL/SQL语言也是该语言的一个特点。,SQL与PL/SQL,PL/SQL是 Procedure Language & Structured Query Language 的缩写。ORACLE的SQL是支持ANSI(American national Standards Institute)和ISO92 (International Standards Organization)标准的产品。PL/SQL是对SQL语言存储过程语言的扩展。,为什么使用PL/SQL,有利于客户/服务器环境应用的运行 适合于客户环境,PL/SQL块结构,PL/SQL程序由三个块组成,即声明部分、执行部分、异常处理部分。,DECLARE /* 声明部分: 在此声明PL/SQL用到的变量,类型及游标,以及局部的存储过程和函数 */ BEGIN /* 执行部分: 过程及SQL 语句 , 即程序的主要部分 */ EXCEPTION /* 执行异常部分: 错误处理 */ END;,PL/SQL块可以分为三类,无名块:动态构造,只能执行一次。 子程序:存储在数据库中的存储过程、函数及包等。当在数据库上建立好后可以在其它程序中调用它们。 触发器:当数据库发生操作时,会触发一些事件,从而自动执行相应的程序。,标识符,PL/SQL程序设计中的标识符定义与SQL 的标识符定义的要求相同。要求和限制有: 标识符名不能超过30字符; 第一个字符必须为字母; 不分大小写; 不能用-(减号); 不能是SQL保留字。,实例,下面的例子将会删除所有的纪录,而不是KING 的记录。,DECLARE v_ename varchar2(20) :=KING; BEGIN DELETE FROM emp WHERE ename=v_ename; END;,如何运行PL/SQL块结构?,如何运行PL/SQL块结构?,建议的命名方法,PL/SQL 变量类型实例,插入一条记录并显示,DECLARE Row_id ROWID; info VARCHAR2(40); BEGIN INSERT INTO dept VALUES (90, SERVICE, BEIJING) RETURNING rowid, dname|:|to_char(deptno)|:|loc INTO row_id, info; DBMS_OUTPUT.PUT_LINE(ROWID:|row_id); DBMS_OUTPUT.PUT_LINE(info); END;,PL/SQL 变量类型实例,其中,RETURNING子句用于检索INSERT语句中所影响的数据行数,当INSERT语句使用VALUES 子句插入数据时,RETURNING 子句还可将列表达式、ROWID和REF值返回到输出变量中。在使用RETURNING 子句是应注意以下几点限制: 不能并行DML语句; 不能检索LONG 类型信息; 当通过视图向基表中插入数据时,只能与单基表视图一起使用。,PL/SQL 变量类型实例,修改一条记录并显示,DECLARE Row_id ROWID; info VARCHAR2(40); BEGIN UPDATE dept SET deptno=80 WHERE DNAME=SERVICE RETURNING rowid, dname|:|to_char(deptno)|:|loc INTO row_id, info; DBMS_OUTPUT.PUT_LINE(ROWID:|row_id); DBMS_OUTPUT.PUT_LINE(info); END;,PL/SQL 变量类型实例,其中,RETURNING子句用于检索被修改行信息,当UPDATE语句修改单行数据时,RETURNING 子句可以检索被修改行的ROWID值,以及行中被修改列的列表达式,并可将他们存储到PL/SQL变量或复合变量中;当UPDATE语句修改多行数据时,RETURNING 子句可以将被修改行的ROWID值,以及列表达式值返回到复合变量数组中。在UPDATE中使用RETURNING 子句的限制与INSERT语句中对RETURNING子句的限制相同。,PL/SQL 变量类型实例,删除一条记录并显示,DECLARE Row_id ROWID; info VARCHAR2(40); BEGIN DELETE dept WHERE DNAME=SERVICE RETURNING rowid, dname|:|to_char(deptno)|:|loc INTO row_id, info; DBMS_OUTPUT.PUT_LINE(ROWID:|row_id); DBMS_OUTPUT.PUT_LINE(info); END;,PL/SQL 变量类型实例,RETURNING子句用于检索被删除行信息,当DELETE语句修改单行数据时,RETURNING 子句可以检索被删除行的ROWID,以及被删除行中列的列表达式,并可将他们存储到PL/SQL变量或复合变量中;当UPDATE语句修改多行数据时,RETURNING 子句可以将被修改行的ROWID,以及列表达式值返回到复合变量数组中。在UPDATE中使用RETURNING 子句的限制与INSERT语句中对RETURNING子句的限制相同 。,复合类型,ORACLE 在 PL/SQL 中除了提供象前面介绍的各种类型外,还提供一种称为复合类型的类型-记录和表。 记录类型 使用%TYPE 使用%ROWTYPE,记录类型,记录类型是把逻辑相关的数据作为一个单元存储起来,它必须包括至少一个标量型(数字型、字符型、布尔型、日期型)或RECORD 数据类型的成员,称作PL/SQL RECORD 的域(FIELD),其作用是存放互不相同但逻辑相关的信息。,定义记录类型语法如下:,TYPE record_type IS RECORD( Field1 type1 NOT NULL := exp1 , Field2 type2 NOT NULL := exp2 , . . . . . . Fieldn typen NOT NULL := expn ) ;,实例,DECLARE TYPE test_rec IS RECORD( Code VARCHAR2(10), Name VARCHAR2(30) NOT NULL :=a book); V_book test_rec; BEGIN V_book.code :=123; V_ :=C+ Programming; DBMS_OUTPUT.PUT_LINE(v_book.code|v_); END;,使用%TYPE,定义一个变量,其数据类型与已经定义的某个数据变量的类型相同,或者与数据库表的某个列的数据类型相同,这时可以使用%TYPE。 使用%TYPE特性的优点在于: 所引用的数据库列的数据类型可以不必知道; 所引用的数据库列的数据类型可以实时改变。,实例 1,DECLARE - 用 %TYPE 类型定义与表相配的字段 TYPE t_Record IS RECORD( T_no emp.empno%TYPE, T_name emp.ename%TYPE, T_sal emp.sal%TYPE ); - 声明接收数据的变量 v_emp t_Record; BEGIN SELECT empno, ename, sal INTO v_emp FROM emp WHERE empno=7788; DBMS_OUTPUT.PUT_LINE (TO_CHAR(v_emp.t_no)|v_emp.t_name|TO_CHAR(v_emp.t_sal); END;,实例 2,DECLARE v_empno emp.empno%TYPE :=,使用%ROWTYPE,PL/SQL 提供%ROWTYPE操作符, 返回一个记录类型,其数据类型和数据库表的数据结构相一致。 使用%ROWTYPE特性的优点在于: 所引用的数据库中列的个数和数据类型可以不必知道; 所引用的数据库中列的个数和数据类型可以实时改变。,实例,DECLARE v_empno emp.empno%TYPE :=,运算符和表达式,算术运算符,运算符和表达式,关系运算符,运算符和表达式,逻辑运算符,变量赋值,在PL/SQL编程中,变量赋值是一个值得注意的地方,它的语法如下: variable 是一个PL/SQL变量, expression 是一个PL/SQL 表达式。,variable := expression ;,字符及数字运算特点,空值加数字仍是空值:NULL + = NULL 空值加(连接)字符,结果为字符:NULL | = ,BOOLEAN 赋值,布尔值只有TRUE, FALSE及 NULL 三个值。如:,DECLARE done BOOLEAN; /* the following statements are legal: */ BEGIN done := FALSE; WHILE NOT done LOOP Null; END LOOP; END;,游标赋值,游标赋值是通过 SELECT语句来完成的,每次执行 SELECT语句就赋值一次,一般要求被赋值的变量与SELECT中的列名要一一对应。,游标赋值,DECLARE emp_id emp.empno%TYPE :=7788; emp_name emp.ename%TYPE; wages emp.sal%TYPE; BEGIN SELECT ename, NVL(sal,0) + NVL(comm,0) INTO emp_name, wages FROM emp WHERE empno = emp_id; DBMS_OUTPUT.PUT_LINE(emp_name|-|to_char(wages); END; 结果: SCOTT-3000,可转换的类型赋值,CHAR 转换为 NUMBER: 使用 TO_NUMBER 函数来完成字符到数字的转换,如: v_total := TO_NUMBER(100.0) + sal; NUMBER 转换为CHAR: 使用 TO_CHAR函数可以实现数字到字符的转换,如: v_comm := TO_CHAR(123.45) | 元 ; 字符转换为日期: 使用 TO_DATE函数可以实现 字符到日期的转换,如: v_date := TO_DATE(2001.07.03,yyyy.mm.dd); 日期转换为字符: 使用 TO_CHAR函数可以实现日期到字符的转换,如: v_to_day := TO_CHAR(SYSDATE, yyyy.mm.dd hh24:mi:ss) ;,变量作用范围及可见性,PL/SQL的变量作用范围特点是: 变量的作用范围是在你所引用的程序单元(块、子程序、包)内。即从声明变量开始到该块的结束。 一个变量(标识)只能在你所引用的块内是可见的。 当一个变量超出了作用范围,PL/SQL引擎就释放用来存放该变量的空间(因为它可能不用了)。 在子块中重新定义该变量后,它的作用仅在该块内。,实例,DECLARE Emess char(80); BEGIN DECLARE V1 NUMBER(4); BEGIN SELECT empno INTO v1 FROM emp WHERE LOWER(job)=president; DBMS_OUTPUT.PUT_LINE(V1); EXCEPTION When TOO_MANY_ROWS THEN DBMS_OUTPUT.PUT_LINE (More than one president); END;,实例 续,DECLARE V1 NUMBER(4); BEGIN SELECT empno INTO v1 FROM emp WHERE LOWER(job)=manager; EXCEPTION When TOO_MANY_ROWS THEN DBMS_OUTPUT.PUT_LINE (More than one manager); END; EXCEPTION When others THEN Emess:=substr(SQLERRM,1,80); DBMS_OUTPUT.PUT_LINE (emess); END;,注释,在PL/SQL里,可以使用两种符号来写注释,即: 使用双 - ( 减号) 加注释 V_Sal NUMBER(12,2); - 工资变量。 使用 /* */ 来加一行或多行注释 /*/ /* 文件名: department_salary.sql */ /*/,示例 简单数据插入例子,DECLARE v_ename VARCHAR2(20) := Bill; v_sal NUMBER(7,2) :=1234.56; v_deptno NUMBER(2) := 10; v_empno NUMBER(4) := 8888; BEGIN INSERT INTO emp ( empno, ename, JOB, sal, deptno , hiredate ) VALUES ( v_empno, v_ename, Manager, v_sal, v_deptno, TO_DATE(1954.06.09,yyyy.mm.dd) ); COMMIT; END;,示例 简单数据删除例子,DECLARE v_empno number(4) := 8888; BEGIN DELETE FROM emp WHERE empno=v_empno; COMMIT; END;,PL/SQL流程控制语句,PL/SQL的流程控制语句包括如下三类: 控制语句:IF 语句; 循环语句:LOOP语句,EXIT语句; 顺序语句:GOTO语句,NULL语句。,条件语句,IF THEN PL/SQL 和 SQL语句 END IF;,IF THEN PL/SQL 和 SQL语句 ELSE 其它语句 END IF;,条件语句,IF THEN PL/SQL 和 SQL语句 ELSIF THEN 其它语句 ELSIF THEN 其它语句 ELSE 其它语句 END IF;,条件语句 实例,DECLARE v_empno emp.empno%TYPE :=,CASE 表达式,CASE selector WHEN expression1 THEN result1 WHEN expression2 THEN result2 WHEN expressionN THEN resultN ELSE resultN+1 END;,CASE 表达式 实例,DECLARE V_grade char(1) := UPPER(,CASE 表达式 实例,代码运行结果: Enter value for p_grade: A old 2: V_grade char(1) := UPPER( Grade:A Appraisal: Excellent,循环,简单循环,LOOP 要执行的语句; EXIT WHEN /*条件满足,退出循环语句*/ END LOOP;,LOOP循环 实例,DECLARE int NUMBER(2) :=0; BEGIN LOOP int := int + 1; DBMS_OUTPUT.PUT_LINE(int 的当前值为:|int); EXIT WHEN int =10; END LOOP; END;,循环,WHILE 循环,WHILE LOOP 要执行的语句; END LOOP;,WHILE循环 实例,DECLARE x NUMBER :=1; BEGIN WHILE x=10 LOOP DBMS_OUTPUT.PUT_LINE(X的当前值为:|x); x:= x+1; END LOOP; END;,循环,数字式循环 每循环一次,循环变量自动加1,使用关键字REVERSE,循环变量自动减1。跟在IN REVERSE 后面的数字必须是从小到大的顺序,而且必须是整数,不能是变量或表达式。可以使用EXIT 退出循环。,FOR 循环计数器 IN REVERSE 下限 上限 LOOP 要执行的语句; END LOOP;,数字式循环 实例,BEGIN FOR int in 110 LOOP DBMS_OUTPUT.PUT_LINE(int 的当前值为: |int); END LOOP; END;,数字式循环 实例,CREATE TABLE temp_table(num_col NUMBER); DECLARE V_counter NUMBER := 10; BEGIN INSERT INTO temp_table(num_col) VALUES (v_counter ); FOR v_counter IN 20 25 LOOP INSERT INTO temp_table (num_col ) VALUES ( v_counter ); END LOOP; INSERT INTO temp_table(num_col) VALUES (v_counter ); FOR v_counter IN REVERSE 20 25 LOOP INSERT INTO temp_table (num_col ) VALUES ( v_counter ); END LOOP; END ; DROP TABLE temp_table;,GOTO和标签, 标号是用括起来的标识符,GOTO label;,GOTO和标签 实例,DECLARE V_counter NUMBER := 1; BEGIN LOOP DBMS_OUTPUT.PUT_LINE(V_counter的当前值为:|V_counter); V_counter := v_counter + 1; IF v_counter 10 THEN GOTO l_ENDofLOOP; END IF; END LOOP; DBMS_OUTPUT.PUT_LINE(V_counter的当前值为:|V_counter); END ;,NULL 语句,DECLARE . . . BEGIN IF v_num IS NULL THEN GOTO print1; END IF; NULL; - 不需要处理任何数据。 END;,游标概念,为了处理 SQL 语句获取一个表中记录,ORACLE提供一个上下文,它提供了一个指向语句的指针以及查询的活动集(active set)。游标是一个指向上下文的句柄( handle)或指针。通过游标,PL/SQL可以控制上下文区和处理语句时上下文区会发生些什么事情。,游标概念,对于不同的SQL语句,游标的使用情况不同:,处理显式游标,显式游标处理需四个 PL/SQL步骤 : 定义游标 格式:CURSOR cursor_name IS select_statement; 打开游标 格式:OPEN cursor_name; 提取游标数据 格式:FETCH cursor_name INTO variable_list | record_variable ; 关闭游标 格式:CLOSE cursor_name;,示例 1,DECLARE CURSOR c_cursor IS SELECT ename, sal FROM emp WHERE rownum11; v_ename emp.ename%TYPE; v_sal emp.sal%TYPE; BEGIN OPEN c_cursor; FETCH c_cursor INTO v_ename, v_sal; WHILE c_cursor %FOUND LOOP DBMS_OUTPUT.PUT_LINE(v_ename|-|to_char(v_sal) ); FETCH c_cursor INTO v_ename, v_sal; END LOOP; CLOSE c_cursor; END;,示例 2,DECLARE DeptRec dept%ROWTYPE; Dept_name dept.dname%TYPE; Dept_loc dept.loc%TYPE; CURSOR c1 IS SELECT dname, loc FROM dept WHERE deptno = 30; CURSOR c2(dept_no NUMBER DEFAULT 10) IS SELECT dname, loc FROM dept WHERE deptno = dept_no; CURSOR c3(dept_no NUMBER DEFAULT 10) IS SELECT * FROM dept WHERE deptno =dept_no; BEGIN OPEN c1; LOOP FETCH c1 INTO dept_name, dept_loc; EXIT WHEN c1%NOTFOUND; DBMS_OUTPUT.PUT_LINE(dept_name|-|dept_loc); END LOOP;,示例 2 续,CLOSE c1; OPEN c2; LOOP FETCH c2 INTO dept_name, dept_loc; EXIT WHEN c2%NOTFOUND; DBMS_OUTPUT.PUT_LINE(dept_name|-|dept_loc); END LOOP; CLOSE c2; OPEN c3(dept_no =20); LOOP FETCH c3 INTO deptrec; EXIT WHEN c3%NOTFOUND; DBMS_OUTPUT.PUT_LINE(deptrec.deptno|-|deptrec.dname |-|deptrec.loc); END LOOP; CLOSE c3; END;,游标属性,%FOUND 布尔型属性,当最近一次读记录时成功返回,则值为TRUE; %NOTFOUND 布尔型属性,与%FOUND相反; %ISOPEN 布尔型属性,当游标已打开时返回 TRUE; %ROWCOUNT 数字型属性,返回已从游标中读取的记录数。,示例,DECLARE v_empno emp.empno%TYPE; v_sal emp.sal%TYPE; CURSOR c_cursor IS SELECT empno, sal FROM emp; BEGIN OPEN c_cursor; LOOP FETCH c_cursor INTO v_empno, v_sal; EXIT WHEN c_cursor %NOTFOUND; IF v_sal=1200 THEN UPDATE emp SET sal=sal+50 WHERE empno=v_empno; DBMS_OUTPUT.PUT_LINE(编码为|v_empno|工资已更新!); END IF; DBMS_OUTPUT.PUT_LINE(记录数:| c_cursor %ROWCOUNT); END LOOP; CLOSE c_cursor; END;,游标的FOR循环,FOR index_variable IN cursor_namevalue, value LOOP - 游标数据处理代码 END LOOP;,游标中使用FOR循环示例,DECLARE CURSOR c_sal IS SELECT empno, ename, sal FROM emp ; BEGIN -隐含打开游标 FOR v_sal IN c_sal LOOP -隐含执行一个FETCH语句 DBMS_OUTPUT.PUT_LINE( to_char(v_sal.empno)|-| v_sal.ename|-|to_char(v_sal.sal) ; -隐含监测c_sal%NOTFOUND END LOOP; -隐含关闭游标 END;,有参数游标中使用FOR循环示例,DECLARE CURSOR c_cursor(dept_no NUMBER DEFAULT 10) IS SELECT dname, loc FROM dept WHERE deptno 30) DBMS_OUTPUT.PUT_LINE(c1_rec.dname|-|c1_rec.loc); END LOOP; DBMS_OUTPUT.PUT_LINE(CHR(10)|使用默认的dept_no参数值10:); FOR c1_rec IN c_cursor LOOP DBMS_OUTPUT.PUT_LINE(c1_rec.dname|-|c1_rec.loc); END LOOP; END;,游标FOR循环语句中使用子查询来实现游标 实例,BEGIN FOR c1_rec IN (SELECT dname, loc FROM dept) LOOP DBMS_OUTPUT.PUT_LINE(c1_rec.dname|-|c1_rec.loc); END LOOP; END;,处理隐式游标,当查询返回结果超过一行时,就需要一个显式游标。显式游标主要是用于对查询语句的处理,尤其是在查询结果为多条记录的情况下;而对于非查询语句,如修改、删除操作,则由ORACLE 系统自动地为这些操作设置游标并创建其工作区,这些由系统隐含创建的游标称为隐式游标,隐式游标的名字为SQL,这是由ORACLE 系统定义的。对于隐式游标的操作,如定义、打开、取值及关闭操作,都由ORACLE 系统自动地完成,无需用户进行处理。用户只能通过隐式游标的相关属性,来完成相应的操作。在隐式游标的工作区中,所存放的数据是与用户自定义的显示游标无关的、最新处理的一条SQL 语句所包含的数据。,处理隐式游标,格式调用为: SQL% 当执行一条DML语句后,DML语句的结果保存在四个游标属性中,这些属性用于控制程序流程或者了解程序的状态。当运行DML语句时,PL/SQL打开一个内建游标并处理结果,游标是维护查询结果的内存中的一个区域,游标在运行DML语句时打开,完成后关闭。,处理隐式游标,隐式游标只使用SQL%FOUND、SQL%NOTFOUND、SQL%ROWCOUNT三个属性,SQL%FOUND,SQL%NOTFOUND是布尔值,SQL%ROWCOUNT是整数值。,处理隐式游标,SQL%FOUND,布尔型属性,当最近一次读记录时成功返回,则值为TRUE。在执行任何DML语句前SQL%FOUND和SQL%NOTFOUND的值都是NULL,在执行DML语句后,SQL%FOUND的属性值将是: INSERT为TRUE; DELETE和UPDATE,至少有一行被DELETE或UPDATE为TRUE; SELECT INTO至少返回一行为TRUE; SQL%FOUND为TRUE时,SQL%NOTFOUND为FALSE。,处理隐式游标 示例,DECLARE V_deptno emp.deptno%TYPE :=,异常错误处理,异常情况处理是用来处理正常执行过程中未预料的事件,程序块的异常处理预定义的错误和自定义错误,由于PL/SQL程序块一旦产生异常而没有指出如何处理时,程序就会自动终止整个程序运行。,有三种类型的异常:,预定义 ( Predefined ) 异常 ORACLE预定义的异常情况大约有24个。对这种异常情况的处理,无需在程序中定义,由ORACLE自动将其引发。 非预定义 ( Predefined ) 异常 即其他标准的ORACLE错误。对这种异常情况的处理,需要用户在程序中定义,然后由ORACLE自动将其引发。 用户定义(User_define) 异常 程序执行过程中,出现编程人员认为的非正常情况。对这种异常情况的处理,需要用户在程序中定义,然后显式地在程序中将其引发。,异常处理部分结构,EXCEPTION WHEN first_exception THEN WHEN second_exception THEN WHEN OTHERS THEN END;,预定义的异常处理,实例,DECLARE v_empno emp.empno%TYPE :=,非预定义的异常处理,非定义的ORACLE错误进行定义,步骤如下: 1. 在PL/SQL 块的定义部分定义异常情况: EXCEPTION; 2. 将其定义好的异常情况,与标准的ORACLE错误联系起来,使用EXCEPTION_INIT语句: PRAGMA EXCEPTION_INIT(, ); 3. 在PL/SQL 块的异常情况处理部分对异常情况做出相应的处理。,示例,INSERT INTO dept VALUES(50, FINANCE, CHICAGO); DECLARE v_deptno dept.deptno%TYPE :=,存储函数和过程,ORACLE 提供可以把PL/SQL 程序存储在数据库中,并可以在任何地方来运行它。这样就叫存储过程或函数。过程和函数统称为PL/SQL子程序,他们是被命名的PL/SQL块,均存储在数据库中,并通过输入、输出参数或输入/输出参数与其调用者交换信息。过程和函数的唯一区别是函数总向调用者返回数据,而过程则不返回数据。在本节中主要介绍: 创建存储过程和函数; 建立和管理存储过程和函数。,创建函数,语法如下:,CREATE or REPLACE FUNCTION function_name (argment in| in out TYPE, argment in | out | in out type RETURN RETURN_type IS | AS BEGIN FUNCTION_body EXCEPTION . . . . . . END function_name;,创建函数 示例,CREATE OR REPLACE FUNCTION get_salary( Dept_no NUMBER, Emp_count OUT NUMBER) RETURN NUMBER IS V_sum NUMBER; BEGIN SELECT SUM(sal), count(*) INTO V_sum, emp_count FROM emp WHERE deptno=dept_no; RETURN v_sum; EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE(你需要的数据不存在!); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(SQLCODE|-|SQLERRM); END get_salary;,函数的调用,格式为: argument_value1,argument_value2 ,函数的调用 实例,DECLARE V_num NUMBER; V_sum NUMBER; BEGIN V_sum :=get_salary(30, v_num); DBMS_OUTPUT.PUT_LINE(30号部门工资总和:|v_sum|,人数:|v_num); END; 运行结果: 30号部门工资总和:9400,人数:6,创建过程,创建过程语法 :,CREATE OR REPLACE PROCEDURE Procedure_name (argment IN | OUT | IN OUT Type, argment IN | OUT | IN OUT Type AUTHID DEFINER | CURRENT_USER IS | AS BEGIN EXCEPTION END;,实例 1,CREATE table logtable (userid VARCHAR2(10), logdate date); CREATE OR REPLACE PROCEDURE logexecution IS BEGIN INSERT INTO logtable (userid, logdate) VALUES (USER, SYSDATE); END;,实例 2,CREATE OR REPLACE PROCEDURE DelEmp (v_empno IN emp.empno%TYPE) AS No_result EXCEPTION; BEGIN DELETE FROM emp WHERE empno=v_empno; IF SQL%NOTFOUND THEN RAISE no_result; END IF; DBMS_OUTPUT.PUT_LINE(编码为|v_empno|的员工已被除名!); EXCEPTION WHEN no_result THEN DBMS_OUTPUT.PUT_LINE(你需要的数据不存在!); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(SQLCODE|-|SQLERRM); END DelEmp;,实例 3,CREATE OR REPLACE PROCEDURE InsertEmp( v_empno in emp.empno%TYPE, v_name in emp.ename%TYPE, v_deptno in emp.deptno%TYPE) AS empno_remaining EXCEPTION; PRAGMA EXCEPTION_INIT(empno_remaining, -1); /* -1 是违反唯一约束条件的错误代码 */ BEGIN INSERT INTO emp(empno, ename, hiredate, deptno) VALUES(v_empno, v_name, sysdate, v_deptno); DBMS_OUTPUT.PUT_LINE(插入数据记录成功!); EXCEPTION WHEN empno_remaining THEN DBMS_OUTPUT.PUT_LINE(违反数据完整性约束!); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(SQLCODE|-|SQLERRM); END InsertEmp;,调用存储过程,ORACLE 使用EXECUTE 语句来实现对存储过程的调用: EXECUTE Procedure_name( parameter1, parameter2);,存储过程和调用 实例1,CREATE OR REPLACE PROCEDURE QueryEmp (v_empno IN emp.empno%TYPE, v_ename OUT emp.ename%TYPE, v_sal OUT emp.sal%TYPE) AS BEGIN SELECT ename, sal INTO v_ename, v_sal FROM emp WHERE empno=v_empno; DBMS_OUTPUT.PUT_LINE(编码为|v_empno|的员工已经查到!); EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE(你需要的数据不存在!); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(SQLCODE|-|SQLERRM); END QueryEmp;,实例2,DECLARE v1 emp.ename%TYPE; v2 emp.sal%TYPE; BEGIN QueryEmp(7788, v1, v2); DBMS_OUTPUT.PUT_LINE(姓名:|v1); DBMS_OUTPUT.PUT_LINE(工资:|v2); QueryEmp(7902, v1, v2); DBMS_OUTPUT.PUT_LINE(姓名:|v1); DBMS_OUTPUT.PUT_LINE(工资:|v2); QueryEmp(8899, v1, v2); DBMS_OUTPUT.PUT_LINE(姓名:|v1); DBMS_OUTPUT.PUT_LINE(工资:|v2); END;,运行结果: 编码为7788的员工已经查到! 姓名:SCOTT 工资:3000 编码为7902的员工已经查到! 姓名:FORD 工资:3000 你需要的数据不存在! 姓名: 工资:,实例3,CREATE OR REPLACE PROCEDURE proc_demo (Dept_no NUMBER DEFAULT 10, Sal_sum OUT NUMBER, Emp_count OUT NUMBER) IS BEGIN SELECT SUM(sal), COUNT(*) INTO sal_sum, emp_count FROM emp WHERE deptno=dept_no; EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE(你需要的数据不存在!); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(SQLCODE|-|SQLERRM); END proc_demo;,实例4,DECLARE V_num NUMBER; V_sum NUMBER(8, 2); BEGIN Proc_demo(30, v_sum, v_num); DBMS_OUTPUT.PUT_LINE(30号部门工资总和:|v_sum|,人数:|v_num); Proc_demo(sal_sum = v_sum, emp_count = v_num); DBMS_OUTPUT.PUT_LINE(10号部门工资总和:|v_sum|,人数:|v_num); END;,运行结果: 30号部门工资总和:9400,人数:6 10号部门工资总和:8750,人数:3,实例5,DECLARE V_num NUMBER; V_sum NUMBER(8, 2); PROCEDURE proc_demo (Dept_no NUMBER DEFAULT 10, Sal_sum OUT NUMBER, Emp_count OUT NUMBER) IS BEGIN SELECT SUM(sal), COUNT(*) INTO sal_sum, emp_count FROM emp WHERE deptno=dept_no; EXCEPTION,实例5 续,WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE(你需要的数
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年教师招聘之《幼儿教师招聘》题库高频难、易错点100题模拟试题及答案详解【新】
- 渔业养殖保险服务创新创业项目商业计划书
- 网络安全事件响应团队创新创业项目商业计划书
- 乳品品牌营销创新创业项目商业计划书
- 2025年教师招聘之《小学教师招聘》试题一及完整答案详解(易错题)
- 2025内蒙古呼伦贝尔陆港国际有限公司市场化选聘总经理、副总经理备考及1套参考答案详解
- 教师招聘之《小学教师招聘》考前冲刺分析及完整答案详解【网校专用】
- 押题宝典教师招聘之《小学教师招聘》模考模拟试题附参考答案详解【典型题】
- 2025年教师招聘之《幼儿教师招聘》每日一练试卷附参考答案详解(典型题)
- 反诈考试题库及答案
- 2025年市级科技馆招聘笔试重点
- 2025西电考试题及答案
- 泡茶的步骤课件
- 2025年先兆流产的护理查房
- 人教版(2024)八年级上册数学全册教案
- (高清版)DB11∕T 2440-2025 学校食堂病媒生物防制规范
- GB/T 7324-2010通用锂基润滑脂
- 重庆医科大学护理学考研大纲
- 物业小区绿化服务程序
- 土地管理法(1986年版)
- 动物遗传学第十章遗传病的传递方式.ppt
评论
0/150
提交评论