技术开发 频道

Oracle入门学习PL/SQL基础

  【IT168 技术文档】

  PL/SQL简介:

  概念:

  优点:性能,可移植

  块特性:

  DECLARE

  声明变量、常量的程序块

  声明部分不能是oracle的保留字,help reserved words

  BEGIN

  执行语句部分的程序块,至少有一句执行语句。比如null;

  EXCEPTION

  异常处理部分的程序块,如果声明和执行部分出现错误,oracle停止这些块的处理,跳转到异常块,是一种回退机制

  END;

  /

  / 是sqlplus中的块终止符,用户输入/ 并回车后,oracle 将刚才输入的代码块传递给数据库的PL/SQL引擎。

  set serveroutput on

  declare

  l_text varchar2(200);

  begin

  l_text :=”hello, world”;

  dbms_output.put_line(l_text);

  exception

  when others then

  dbms_output.put_line(“We encountered an exception!”);

  raise;

  end;

  /

  set serveroutput on

  declare

  l_number number :=1;

  begin

  l_number++;

  dbms_output.put_line(‘1+1=’|| to_char(l_number)||’!’);

  exception

  when others then

  dbms_output.put_line(‘We encountered an exception!’);

  end;

  /

  块嵌套:

  程序块可以在可执行部分和异常处理部分包含另外的程序块

  set serveroutput on

  declare -- begin block 1

  l_text varchar2(100);

  begin

  l_text := ‘Block1’;

  dbms_output.put_line(l_text);

  declare --begin block 2

  l_more_text varchar2(100);

  begin

  l_more_text := ‘Block2’;

  dbms_output.put_line(l_more_text);

  end; -- end block 2

  end; -- end block 1

  /

  声明部分:

  变量和常量都必须在声明( declare )部分定义,必须规定名称和数据类型。

  Declare

  L_number number;

  Begin

  L_number :=100;

  End;

  /

  也可以在声明部分为变量赋值,即初始化变量。

  Declare

  L_number number := 100;

  Begin

  Null;

  End;

  /

  常量:

  1、 不能改变

  2、 必须在声明的时候初始化常量

  3、 必须在数据类型的左边规定constant

  declare

  l_number constant number := 10;

  begin

  null;

  end;

  /

  如果没有初始化:

  declare

  l_number constant number;

  begin

  null;

  end;

  /

  报错,不同于在异常块中定义的异常,这是一种编译期间的错误,异常块捕捉不到。

  如果执行过程中改变常量:

  declare

  l_number constant number := 10;

  begin

  l_number := 20;

  end;

  /

  报错。

  为常量变量赋值:

  :=

  声明部分可以指定默认值:

  variable datatype default expression;

  declare

  l_weeks_in_month number default 4;

  begin

  l_weeks_in_month := 5;

  end;

  /

  使用not null 操作符:

  declare

  l_number number not null := 1;

  l_number2 number;

  begin

  l_number:=10;

  l_number:=l_number2;

  end;

  /

  作用域:

  declare

  l_parent_number number;

  begin

  l_parent_number :=1;

  declare

  l_child_number number :=2;

  begin

  dbms_output.put_line(l_parent_number);

  end;

  l_child_number :=3;

  end;

  /

  l_parent_number 整个块内都可见,l_child_number只在黑体部分可见。

  可视性:

  Declare

  L_number1 number := l_number2;

  L_number2 number :=10;

  Begin

  Null;

  End;

  /

  只有声明之后,pl/sql才知道变量/常量的存在。

  数据类型:

  PL/SQL与SQL使用相同的数据类型,只是界限上有些不同。罗列一些不同。

  记录:

  TYPE IS RECORD(

  字段 类型。。。

  );

  declare

  type location_record is record(

  city varchar2(30),

  state varchar2(30)

  );

  l_my_loc location_record;

  begin

  l_my_loc.city :=’Reston’;

  l_my_loc.state :=’CA’;

  dbms_output.put_line(l_my_loc.city);

  dbms_output.put_line(l_my_loc.state);

  end;

  /

  使用%TYPE和%ROWTYPE

  %ROWTYPE: 当用户声明表示表,视图或者游标的某个行的记录变量时,使用

  如果,不是声明整个行的变量,而是某个列的时候,使用%TYPE

  connect hr/hr

  desc departments

  declare

  l_dept departments%rowtype;

  l_dept_name departments.department_name%type;

  begin

  l_dept.department_id:=1000;

  l_dept.department_name:=’AA’;

  insert into departments(department_id, department_name)

  values(l_dept.department_id, l_dept.department_name);

  l_dept.department_id:=1001;

  l_dept_name:=’BB’;

  insert into departments(department_id, department_name)

  values(l_dept.department_id, l_dept_name);

  end;

  /

  逻辑比较:

  控制语句:

  条件

  1. IF .. THEN ..ELSE 语句:

  1) IF .. THEN

  …;

  END IF;

  2) IF ... THEN

  …;

  ELSE

  …

  END IF;

  3) IF ... THEN

  …;

  ELSIF … THEN

  …;

  ELSE

  …;

  END IF;

  2. CASE 语句

  CASE 变量

  WHEN 值1 THEN

  …;

  WHEN 值2 THEN

  …;

  ELSE …;

  END CASE;

  ~~~~~~~~~~~~~~~~~~~~~~~~~~~

  CASE

  WHEN 条件1 THEN

  …;

  ELSE

  …;

  END CASE;

  循环:

  1. 无条件循环:

  declare

  l_loops number:=0;

  begin

  loop

  if l_loops >4 then

  exit;

  end if;

  dbms_output.put_line(‘Looped ‘ || l_loops || ‘times’);

  l_loops := l_loops + 1;

  end loop;

  end;

  /

  declare

  l_loops number:=0;

  begin

  loop

  exit when l_loops > 4;

  dbms_output.pub_line(‘Looped ‘ || l_loops || ‘times’);

  l_loops : = l_loops: + 1;

  end loop;

  end;

  /

  2. FOR循环

  Declare

  Begin

  For I in 1.. 4 loop

  Dbms_output.put_line(I);

  End loop;

  End;

  /

  降序:for I in reverse 4.. 1 loop

  3. WHILE 循环

  declare

  l_loops number:=0;

  begin

  while l_loops < 5 loop

  dbms_output.put_line(‘Looped ‘ || l_loops || ‘times’);

  l_loops := l_loops + 1;

  end loop;

  end;

  goto 语句

  异常和游标管理

  游标:

  用来查询数据库,获取记录集合(结果集)的指针,可以让开发者一次访问一行结果集,在每条结果集上作操作。

  分类:

  静态游标:

  分为显示游标和隐示游标。

  REF游标:

  是一种引用类型,类似于指针。

  显示游标:

  CURSOR 游标名 ( 参数 ) [返回值类型] IS

  Select 语句

  生命周期:

  1. 打开游标(OPEN): 解析,绑定。。。

  2. 从游标中获取记录(FETCH INTO):执行查询,返回结果集

  3. 关闭游标(CLOSE)

  隐示游标:

  不用明确建立游标变量,分两种:

  1. 在PL/SQL中使用DML语言,使用ORACLE提供的名为SQL的隐示游标

  2. CURSOR FOR LOOP

  1举例:

  declare

  begin

  update departments set department_name=department_name

  where 1=2;

  dbms_output.pub_line(‘update ‘|| sql%rowcount ||’ records’);

  end;

  /

  2举例:

  declare

  begin

  for my_cursor in ( select department_name, department_id from departments)

  loop

  dbms_output.pub_line(my_cursor.department_id || ‘ : ’ my_cursor.department_name);

  end;

  /

  游标属性:

  %FOUND

  %NOTFOUND

  %ROWCOUNT

  %ISOPEN

  REF游标

 

0
相关文章