PL/SQL学习笔记

来源:互联网 发布:json数据格式 编辑:程序博客网 时间:2024/05/18 17:57

PLSQL是什么?

首先我们看一下什么是PLSQL,oracle给出的定义是:PL/SQL is a procedural language designed specifically to embrace SQL statements within its syntax. PL/SQL program units are compiled by the Oracle Database server and stored inside the database. And at run-time, both PL/SQL and SQL run within the same server process, bringing optimal efficiency. PL/SQL automatically inherits the robustness, security, and portability of the Oracle Database.

PL/ SQL是一种在其语法上接受SQL语句的过程化语言。PL/ SQL程序单元由Oracle数据库服务器编译,并存储在数据库中。在运行时,PL / SQL和SQL在相同的服务进程中运行,带来了最佳效率。PL/ SQL自动继承Oracle数据库的健壮性、安全性和可移植性。

为什么我们要用PL/SQL?

Oracle给出的why是这样一段话:An application that uses Oracle Database is worthless unless only correct and complete data is persisted. The time-honored way to ensure this is to expose the database only via an interface that hides the implementation details – the tables and the SQL statements that operate on these. This approach is generally called the thick database paradigm, because PL/SQL subprograms inside the database issue the SQL statements from code that implements the surrounding business logic; and because the data can be changed and viewed only through a PL/SQL interface.

一个没有正确和完整的持久化数据的使用Oracle数据库的应用程序是毫无价值的。确保正确使用oracle的一种由来已久的方法是只通过隐藏实现细节(操作这些表和SQL语句)的接口来公开数据库,这种方法通常被称为粗数据库范例,因为数据库中的PL / SQL子程序会从实现周围业务逻辑的代码中发出SQL语句,同时仅可以通过PL / SQL接口进行更改和查看数据。

使用PL/SQL可以编写具有很多高级功能的程序,虽然通过多个SQL语句可能也能实现同样的功能,但是相比而言,PL/SQL具有更为明显的一些优点:(以下优点来自百度知道)

  1. 能够使一组SQL语句的功能更具模块化程序特点;
  2. 采用了过程性语言控制程序的结构,程序代码易于理解
  3. 可以对程序中的错误进行自动处理,使程序能够在遇到错误的时候不会被中断;
  4. 具有较好的可移植性,可以移植到另一个Oracle数据库中;
  5. 集成在数据库服务器中,可以对数据进行快速高效的处理;
  6. 减少了网络的交互,有助于提高程序性能;

如果涉及到大量的增删改查操作,在PL/SQL中执行的效率是远远高于sql的。实际上PL/SQL和sql更多的是一种弥补关系。

PL/SQL的迭代控制

应用场景设想:
预先查询大量数据并且循环处理这些数据获取结果,再根据这些结果对数据库进行操作。在这种情况下(默认使用Oracle数据库,否则哪会有PL/SQL -_-||)提高程序效率的最佳方法应该是使用PL/SQL直接对数据库进行操作返回最终结果。

sqlplus多行粘贴的小提示

由于sqlplus命令行中无法按方向键调节输入指针位置,导致在发现输入语法错误的时候很难修改多行以前的代码。这里建议大家直接在记事本中编写PL/SQL代码,复制之后直接粘贴到sqlplus命令行窗口中,输入斜杠/运行程序。如最后一图。
如果在复制粘贴的时候命令行报错,则尝试以下操作:
复制的时候不要复制最后一行end;中的分号,我们在sqlplus命令行窗口中手动输入分号,然后回车,输入斜杠/,即可正常运行程序,如下图二。

loop循环

  • Loop-exit-end循环:此循环由三部分组成,见下例
declarecnt number;begin cnt:=1; loop   cnt:=cnt+1;   if cnt>=100 then      exit;   end if; end loop;end;

这里写图片描述

  • Loop-exit-when-end循环:
declare    cnt  binary_integer:=1;begin    loop      dbms_output.put_line(cnt);      cnt:=cnt+1;      exit when cnt>=5;    end loop;end;

这里写图片描述

while-Loop循环

在while部分测试退出条件。

declare    cnt  binary_integer:=1;begin    while cnt<=5 loop         dbms_output.put_line(cnt);         cnt:=cnt+1;   end loop;end;   

这里写图片描述

for循环

  • 语法规则
    for loop_counter in [reverse] low_bound ..high_bound loop
    ..
    end loop;
    这里loop_counter是隐式声明的索引变量。例:
begin    for v_counter in 1..10  loop       dbms_output.put_line(v_counter);   end loop;end;

这里写图片描述

  • 域法则
    for循环的循环索引被隐式声明为binary_integer,在循环前面没有必要声明他。如果对他进行了声明,那么循环索引将隐蔽外层的声明。正如内部块的声明会隐蔽外部块的声明一样。

  • 使用reverse
    如果在for循环中有reverse关键字,则循环索引将从最大值向最小值进行迭代。仍然是先写小值,后写大值。

begin   for v_counter in reverse 0..10 loop      dbms_output.put_line(v_counter);   end loop;end

这里写图片描述

  • 循环范围
    最大值和最小值没有必要是数值文字,他们可以是能够被转换为数字值的任何表达式。
declare    v_lowervalue  number:=0;    v_highvalue number:=10;begin   for v_counter in v_lowervalue ..v_highvalue loop       dbms_output.put_line(v_counter);   end loop;end;

这里写图片描述

关于在PL/SQL中使用正确的循环控制

  当你在 PL/SQL 中处理一个被索引的表时,很多情况下你不能确定表上是否存在索引,所以你不能使用最明显的 FOR 循环方式来循环表中的值。例如:

declare    type my list_type is table of number index by pls_integer;    mylist mylist_type;begin    -- start at 2, instead of 1    mylist(2) := 2;    mylist(3) := 3;    -- skip 4 and 5    mylist(6) := 6;    for i in 1..mylist.count loop      dbms_output.put_line(mylist(i));    end loop;end;

  前面的代码将返回 ORA-01403 错误:由于缺少索引1,没有发现数据。详细了解

原创粉丝点击