`
jxb1016
  • 浏览: 22494 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Oracle的PL/SQL块

阅读更多
声明:本文章中所有采用的表均是Oracle范例用户Scott/tiger的表Emp,dept等。
一,PL/SQL块:

概念:PL/SQL 是过程语言(Procedural Language)与结构化查询语言(SQL)结合而成的编程语言。

分类:  a,匿名:一次性使用,不可复用。
b,命名:包括(存储过程,触发器,函数等),存储在数据库内部,可重复使用。  

优点:  a,支持 SQL,在 PL/SQL 中可以使用:

1,数据操纵命令
2,事务控制命令
3,游标控制
4,SQL 函数和 SQL 运算符
5,支持面向对象编程 (OOP)
6,可移植性,可运行在任何操作系统和平台上的Oralce 数据库
7,更佳的性能,PL/SQL 经过编译执行

b,与 SQL 紧密集成,简化数据处理。

1,支持所有 SQL 数据类型
2,支持 NULL 值
3,支持 %TYPE 和 %ROWTYPE 属性类型(%type能自动获得表中某列的类型,%rowtype            能自动获得一整行数据的类型,相当于一个实体的类型)

c,安全性,可以通过存储过程限制用户对数据的访问

体系结构: 
    用户编写好pl/sql语句,发送给Oracle服务器,然后oracle服务器上的pl/sql引擎对其编译 执行,其中属于sql的语句,将其转发送给sql引擎处理,pl/sql的由pl/sql引擎自身处理,最后 把结果整合好返回给用户。

匿名pl/sql块:

a,语法结构:

declare
    声明变量/游标/异常
begin
    可执行的sql或pl/sql语句
exception
    异常处理语句
end

b,具体示例:
		declare
  		  v_empno emp.empno%type;
  		  v_empname emp.ename%type;
  		begin
     		  v_empno:=7788;
     		  select ename into v_empname from emp where empno=v_empno;
     		  dbms_output.put_line(v_empno||':'||v_empname);
  		exception
     		  when too_many_rows then
     		  dbms_output.put_line('many rows exception!');
     		  when others then
     		  dbms_output.put_line('other excetption!');
		end;

              其中:要在command window中设置set serverout on 才能顺利的把             dbms_output.put_line()中的内容打印出来;在异常处理的时候,可以先制定确切的异       常类型too_many_rows或其他类型的异常,此异常拦截不住的话,由others来最后处理。

变量:

a,PL/SQL 块中可以使用变量和常量
1,在声明部分声明,使用前必须先声明
2,声明时必须指定数据类型,每行声明一个标识符
3,在可执行部分的 SQL 语句和过程语句中使用
b,声明变量和常量的语法:
identifier [CONSTANT] datatype [NOT NULL]   [:= | DEFAULT expr];
示例:  c_rate CONSTANT NUMBER := 0.10;
c,给变量赋值有两种方法:
1,使用赋值语句 :=
2,使用 SELECT INTO 语句,
示例:
select ename into v_empname from emp where empno=v_empno;

异常:
概念:可以控制,通过捕获处理,可以是程序继续执行其他程序块。程序不死亡。
分类:
    1,预定义异常
    2,自定义异常:业务相关的异常(不符合业务规则的处理手段)
自定义异常的步骤:
    1,声明异常:declare v_myexception exception;
    2, 根据条件跑出异常:raise v_myexception ;
    3, 处理异常:EXCEPTION
  WHEN invalidCATEGORY THEN
    DBMS_OUTPUT.PUT_LINE('无法识别该类别');
        示例:
	    DECLARE 
  		invalidCATEGORY EXCEPTION;
  		category VARCHAR2(10);
	    BEGIN
  		category := '&Category';
  	    		IF category NOT IN ('附件','顶盖','备件') THEN
    			RAISE invalidCATEGORY;
  	    	ELSE
    			DBMS_OUTPUT.PUT_LINE('您输入的类别是'|| category);
  		END IF;
	    EXCEPTION
 			WHEN invalidCATEGORY THEN
    			DBMS_OUTPUT.PUT_LINE('无法识别该类别');
	    END;

错误:
概念:系统爆发的严重错误,或抛出错误,系统程序死亡,崩溃。
抛出方法:RAISE_APPLICATION_ERROR(-20001, '未指定项费率');
注意,我们定义错误号码时要大于20000,而且抛出错误要放在处理异常中,             因为错误被系统认为异常,会被一场处理拦截。
   什么时候用:在出现业务上无法继续进行的情况,或程序中无法继续进行的情况,我们手动抛出                    错误来终止程序。
示例:
		DECLARE
  			rate itemfile.itemrate%TYPE;
  			rate_exception EXCEPTION;
		BEGIN
  			SELECT NVL(itemrate,0) INTO rate FROM itemfile 
  			WHERE  itemcode = 'i207';
  			IF rate = 0 THEN
    				RAISE rate_exception;
  			ELSE
   				DBMS_OUTPUT.PUT_LINE('项费率为:' || rate);
  			END IF;
		EXCEPTION
  			WHEN rate_exception THEN
    			RAISE_APPLICATION_ERROR(-20001, '未指定项费率');
		END;

控制结构:
条件控制:
IF 语句(if then end if;  if then elsif then else end if)
示例:
			DECLARE
    				icode VARCHAR2(4);
    				irate NUMBER;
			BEGIN
    				icode := 'i203';
  				SELECT itemrate INTO irate FROM itemfile 
  				WHERE  itemcode = icode;
  				IF irate > 200 THEN
    					UPDATE itemfile SET itemrate = itemrate - 200
    					WHERE itemcode = icode;
  				ELSE
    					UPDATE itemfile SET itemrate = itemrate - 50
    					WHERE itemcode = icode;
  				END IF;
  					DBMS_OUTPUT.PUT_LINE('itemrate='|| irate);
			END;

CASE 语句:
示例:
				BEGIN
    				    CASE ‘&grade’
      					WHEN ’A’ THEN DBMS_OUTPUT.PUT_LINE(’优异’);
      					WHEN ’B’ THEN DBMS_OUTPUT.PUT_LINE (优秀’);
      					WHEN ’C’ THEN DBMS_OUTPUT.PUT_LINE (’良好’);
      					WHEN ’D’ THEN DBMS_OUTPUT.PUT_LINE (’一般’);
      					WHEN ’F’ THEN DBMS_OUTPUT.PUT_LINE (’较差’);
      					ELSE DBMS_OUTPUT.PUT_LINE (’没有此成绩’);
    					END CASE;
				END;

循环控制
LOOP 循环:
示例:
			declare
				v_count number:=1;
			begin
			loop
			        v_count:=v_count+1;
				dbms_output.put_line(v_count);
				exit when v_count>10;
			end loop;
			end;


WHILE 循环
示例:
WHILE 循环条件 LOOP
  要循环的代码
END LOOP;

FOR 循环
示例:
FOR 计数器 IN [REVERSE] 起始值..结束值
LOOP
  要循环的代码
END LOOP;

顺序控制
GOTO 语句
                     一般不用,用的话如下例:
               			DECLARE
  					qtyhand itemfile.qty_hand%type;
  					relevel itemfile.re_level%type;
				BEGIN
  					SELECT qty_hand,re_level INTO qtyhand,relevel
  					FROM itemfile WHERE itemcode = 'i201';
  					IF qtyhand < relevel THEN
    						GOTO updation;
  					ELSE
    						GOTO quit;
  					END IF;
  					<<updation>>
  					UPDATE itemfile SET qty_hand = qty_hand + re_level
  					WHERE itemcode = 'i201';
  					<<quit>>
  					NULL;
				END;


NULL 语句:为凑成语法而用,如上例。
动态绑定变量:
SQL语句执行过程:首先,系统将SQL语句进行字符串解析,直到在系统内部组成一条完整的可执                       行的sql执行计划时候,再通过执行该计划返回结果,其中,两条SQL语句的字符                      上有一点点差异,都认为是不同的执行计划,这个时候,还是用绑定变量的机制                       能解决同一SQL多执行计划的问题。
用法和适用场合:
			declare
  				empRec emp%rowtype;
  				sqlStr varchar2(200);
			begin
  				--DDL动态SQL语句--
  				execute immediate 'create table test(id number(4))';
  
  				--带绑定变量的动态SQL语句--
  				sqlStr:='select * from emp where empno=:id';
  				execute immediate sqlStr into empRec using 7934;
  				dbms_output.put_line(empRec.ename);

  				--字符串联接生成的动态SQL语句--
  				sqlStr:='select * from emp'||' '||'where empno=7788';
  				execute immediate sqlStr into empRec;
  				dbms_output.put_line(empRec.ename);
			end;


上机实验:
      a,依据薪水分级:
declare
v_empno_exception exception;
v_empsal emp.sal%type;
v_empno emp.empno%type;
sqlstr varchar2(200);
begin
v_empno:=&e;
sqlstr:='select sal  from emp where empno=:eno';
execute immediate sqlstr into v_empsal using v_empno;
case
when v_empsal<=1000 then dbms_output.put_line('d');
when v_empsal<=2000 then dbms_output.put_line('c');
when v_empsal<=3000 then dbms_output.put_line('b');
else dbms_output.put_line('A');
end case;

exception
  when no_data_found then 
  dbms_output.put_line('此用户不存在!');
end;

      b,编写自定义异常,余额不足问题
declare
v_lessBalance_exception exception;
v_balance number:=1000;
v_cashNumber number;
begin
v_cashNumber:=&cno;
if v_cashNumber>v_balance-5 then
   raise v_lessBalance_exception;
else
   dbms_output.put_line('余额为'||(v_balance-v_cashNumber));
end if;

exception
    when v_lessBalance_exception then 
    dbms_output.put_line('余额不足!');
end;








1
1
分享到:
评论

相关推荐

    Oracle PL/SQL实战(待续)

    Oracle PL/SQL是一种强大的编程语言,它结合了SQL的数据处理能力与PL的程序设计特性,是Oracle数据库系统中用于创建存储过程、函数、触发器和包的主要工具。在这个"Oracle PL/SQL实战(待续)"的主题中,我们将深入...

    Oracle PL/SQL程序设计(第5版)(上下册)

    - **块结构**:PL/SQL程序通常被组织成块,每个块由声明部分、执行部分和异常处理部分组成。 - **子程序**:包括存储过程和函数。这些子程序可以被其他PL/SQL代码调用,实现代码复用和模块化。 - **包**:包是一种...

    oracle pl/sql从入门到精通 配套源代码

    PL/SQL是Oracle数据库的内置编程语言,由块构成,包括声明部分、执行部分和异常处理部分。块可以是匿名块(即直接在SQL*Plus或其他工具中编写的一次性执行的代码),也可以是存储过程、函数、触发器、包等可重用的...

    Oracle PL/SQL程序设计(第5版)(套装上下册)

    《Oracle PL/SQL程序设计(第5版)(套装上下册)》基于Oracle数据库11g,从PL/SQL编程、PL/SQL程序结构、PL/SQL程序数据、PL/SQL中的SQL、PL/SQL应用构建、高级PL/SQL主题这6个方面详细系统地讨论了PL/SQL以及如何...

    Oracle PL/SQL 实例精解(第4版涵盖Oracle 11g)+源码脚本

    书中会详细介绍如何编写简单的PL/SQL块,包括声明部分、执行部分和异常处理部分。 2. **数据类型**:Oracle PL/SQL支持多种内置数据类型,如NUMBER、VARCHAR2、DATE等。书中会解释每种数据类型的用法,并通过实例...

    Oracle PL/SQL实例精解 数据库建立代码

    Oracle PL/SQL是一种强大的编程语言,它结合了SQL的数据库操作能力和PL/SQL的结构化编程特性,使得数据库开发者能够创建复杂的应用程序和数据库逻辑。在"Oracle PL/SQL实例精解 数据库建立代码"中,我们将深入探讨...

    ORACLE PL/SQL从入门到精通

    ORACLE PL/SQL是从入门到精通的专业知识,涵盖了数据库开发与管理的多个方面,包括触发器、过程、函数、软件包、异常处理、游标、循环、分支、变量使用、数据库安装等关键知识点。 触发器是数据库中用来保证数据...

    Oracle PL/SQL学习官方教材

    Oracle PL/SQL是一种强大的编程语言,它将SQL与过程编程语言的特性相结合,为数据库开发提供了丰富的功能。在Oracle数据库环境中,PL/SQL是开发高效、可靠和可维护的数据库应用程序的关键工具。以下是对"Oracle PL/...

    oracle pl/sql实例精讲student数据库模式数据和表脚本

    PL/SQL代码块通常由声明部分、执行部分和异常处理部分组成。声明部分定义变量、游标、常量等;执行部分是实际执行的代码,包括对数据库的查询、更新和插入操作;异常处理部分用于捕获并处理可能出现的错误。 在...

    Oracle PL/SQL专家指南-高级PL/SQL解决方案的设计与开发

    《Oracle PL/SQL专家指南-高级PL/SQL解决方案的设计与开发》是一本深入探讨Oracle数据库中的PL/SQL编程的专业书籍。PL/SQL是Oracle数据库特有的编程语言,它结合了SQL的查询能力与过程式编程语言的功能,使得数据库...

    Oracle PL/SQL编程及最佳实践

    Oracle PL/SQL 编程及最佳实践 Oracle PL/SQL 是一种高级编程语言,用于开发 Oracle 数据库中的存储过程、函数和触发器。PL/SQL language 提供了强大的编程能力,可以实现复杂的业务逻辑,并且与 Oracle 数据库紧密...

    oracle 9i pl/sql程序设计笔记

    ### Oracle 9i PL/SQL程序设计笔记精要 #### PL/SQL基础知识概览 **标题与描述**:本文档围绕“Oracle 9i PL/SQL程序设计笔记”这一核心主题,深入探讨了PL/SQL语言的基础知识及其在Oracle 9i数据库环境中的应用。...

    oracle10g_pl/sql

    Oracle 10g PL/SQL 是Oracle数据库系统中用于创建和管理存储过程、函数、触发器等数据库对象的编程语言。本教程旨在为初学者提供一个全面的学习平台,同时也为经验丰富的开发者提供参考资料。PL/SQL是Oracle特有的...

    Oracle PL/SQL best practice

    - 自主事务:了解如何在PL/SQL块中使用自主事务来实现局部控制,确保数据的一致性,同时不影响全局事务。 - 调用者权利:理解Invoker's Rights与Definer's Rights的区别,确保安全地执行代码,尤其是在共享库或API...

    Oracle PL/SQL programming(5th Edition)

    ### Oracle PL/SQL Programming知识点概览 #### 一、书籍基本信息 - **书名**:Oracle PL/SQL Programming(第五版) - **作者**:Steven Feuerstein 和 Bill Pribyl - **出版日期**:2009年10月1日 - **出版社**:...

    Oracle PL/SQL by Example(4th Edition)

    《Oracle PL/SQL by Example(4th Edition)》是一本专为Oracle数据库用户设计的PL/SQL编程指南,尤其适合那些希望通过实践学习这一强大的过程式语言的开发者。本书的第四版详细介绍了Oracle PL/SQL的各种核心概念和...

    《精通Oracle PL/SQL》源码

    Oracle PL/SQL是一种强大的编程语言,它结合了SQL(结构化查询语言)的数据库操作能力和PL(过程化语言)的程序设计特性,是Oracle数据库系统中的核心组件之一。《精通Oracle PL/SQL》这本书深入探讨了这个语言的...

    ORACLE PL/SQL 程序设计(第五版)

    《ORACLE PL/SQL 程序设计(第五版)》是Oracle数据库开发领域的一本经典教程,专注于讲解如何使用PL/SQL这一强大的过程化语言进行数据库编程。这本书旨在帮助读者掌握PL/SQL的基本概念、语法和高级特性,以便在实际...

Global site tag (gtag.js) - Google Analytics