PL/SQL基础信息

SQL语言简介:

 

数据操纵语言:Data Manipuliation Language,DML  insert,update,delete

事务控件语言:Transactional Control Language,TCL  commit,rollback,savepoint

数据定义语言:Data Definition Language,DDL   create table,alter table…..

数据控制语言:Data Control Language,DCL    grant,revoke

 

SQL语句编写规则

◇     SQL关键字不区分大小写

◇     对象名和列名不区分大小写

◇     字符值和日期值区分大小写

◇     在应用程序中编写SQL语句时,SQL可以单行或多行同时存在

 

PL/SQL简介

PL/SQLOracle在标准SQL语言上的过程性扩展,可以嵌入SQL语句,而且允许定义变量和常量,允许过程语言结构,允许使用例外处理Oracle错误等

◇     提高应用程序的运行性能

◇     提供模块化的程序设计功能

◇     允许定义标识符

◇     具有过程语言控制结构

◇     具有良好的兼容性

◇     处理运行错误

 

--定义函数

create or replace function get_salary(pid int)

return number

is

  salary number(16,2);

begin

  select salary into salary from test3 where id=pid;

  dbms_output.put_line(to_char(salary));

  return salary;

end;

 

--过程控制

declare

cursor emp_cursor is select ename,sal from emp for update;

emp_record empcursor%rowtype;

begin

open emp_cursor;

loop

  fetch emp_cursor into emp_record;

  Exit when emp_cursor%notfound;

  If emp_record.aal<200 then

    Update emp set sal=sal*1.1 where current of emp_cursor;

   End if;

End loop;

End;

 

--处理错误

Declare

  Name varchar2(10);

Begin

  Select ename into name from emp where empno=no;

  Dbms_output.put_line(name);

Exception

  When no_data_found then

     Dbms_output.put_line(‘没有查询到’);

End;

 

Oracle 10G PL/SQL新特征

 

第二章 PL/SQL开发工具

SQL*PLUS

PL/DEV

TOAD

第三章 PL/SQL基础

◆了解PL/SQL块的基本结构以及PL/SQL块的分类

◆学会在PL/SQL块上定义和使用变量

◆学会在PL/SQL块中编写可执行语句

◆了解编写PL/SQL代码的指导方针

◆了解10g新特性

 

3.1.1 PL/SQL块结构

定义,执行,错误处理

Declare

……

Begin

……/*执行部分是必需的*/

Exception

…..

End; /*结束*/

 

以下是三个例子:

1.       包括执行部分的块

SQL> set serveroutput on

SQL> begin

  2    dbms_output.put_line('hello world');

  3  end;

  4  /

hello world

 

2.       包括定义,执行部分的块

SQL> declare

  2     vname varchar2(10);

  3  begin

  4     select name into vname from test3 where id=&id;

  5     dbms_output.put_line(vname);

  6  end;

  7  /

输入 id 的值:  1

原值    4:    select name into vname from test3 where id=&id;

新值    4:    select name into vname from test3 where id=1;

zxf

 

PL/SQL 过程已成功完成。

 

3.       包括定义,执行,错误处理的块

SQL>

  1  declare

  2     vname varchar2(10);

  3  begin

  4     select name into vname from test3 where id=&id;

  5     dbms_output.put_line(vname);

  6  exception

  7     when NO_DATA_FOUND then

  8        dbms_output.put_line('not found info');

  9* end;

SQL> /

输入 id 的值:  1

原值    4:    select name into vname from test3 where id=&id;

新值    4:    select name into vname from test3 where id=1;

zxf

 

PL/SQL 过程已成功完成。

 

SQL> /

输入 id 的值:  9

原值    4:    select name into vname from test3 where id=&id;

新值    4:    select name into vname from test3 where id=9;

not found info

 

PL/SQL 过程已成功完成。

3.1.2 块分类

1匿名块

是指没有名称的PL/SQL块,匿名块既可以内嵌到应用程序中,也可以在交互式环境中直接调用.

2命名块

命名块是指具有特定名称标识的PL/SQL块,命名块与匿名块非常相似,只不过在PL/SQL块前使用<<>>加以标记。

SQL> <>

  2  declare

  3    vname varchar2(10);

  4  begin

  5    <>

  6    begin

  7      select name into vname from test3 where id=&id;

  8    end;--<>

  9    dbms_output.put_line('outer pl/sql');

 10  end;--<>

 11  /

输入 id 的值:  1

原值    7:     select name into vname from test3 where id=&id;

新值    7:     select name into vname from test3 where id=1;

outer pl/sql

 

PL/SQL 过程已成功完成。

 

3子程序 (过程,函数,包)

(1)       过程,用于执行特定操作,当建立过程时,既可以指定输入参数in,也可以指定输入参数out.  创建语句 

create or replace procedure procedure name 

is

begin …..

end;

(2)       函数,用于返回特定数据,如开始定义的函数 get_salary(no number);返回数字型数据。

(3)       包用于逻辑组合相关的过程和函数,它由规范和包体两部分组成。

 SQL> create package zxf_pkg is

  2  procedure update_sal(name varchar2,newsal number);

  3  function get_salary(name varchar2) return number;

  4  end;

  5  /

 

程序包已创建。

SQL> ed

已写入 file afiedt.buf

 

  1  create or replace package body zxf_pkg is

  2    procedure update_sal(name varchar2,newsal number)

  3    is

  4    begin

  5      update test3 set salary=newsal where name=name;

  6    end;

  7    function get_salary(name varchar2) return number

  8    is

  9      vsal number(16,2);

 10    begin

 11      select salary into vsal from test3 where name=name;

 12      return vsal;

 13    end;

 14* end;

 

4触发器

 

3.2    定义并使用变量

标量类型,复合类型,参照类型,LOB类型

标量类型:char,log,varchar2,varchar,Boolean,date,real…….

复合类型:Record,table,varray

参照类型:ref_cursor   ref objecttype

LOB类型:BFILE,BLOB,CLOB,NCLOB

3.2.1 标量变量

标量变量是指只能存放单个数值的变量.

1常用标量类型

 Varchar2(n)

 Char(n)

 Number(p,s)

 Date

 Timestamp

 Long,logn RAW

 Boolean

 Binary_float,Binary_double

2定义标量变量和使用变量

 Identifier [constant] datatype [not null] [:= |default expr]

SQL>

  1  declare

  2    v_ename varchar2(10);

  3    v_sal number(6,2);

  4    v_balance binary_float;

  5    c_tax_rate constant number(3,2) := 5.8;

  6    v_hiredate date;

  7    v_valid boolean not null default false;

  8  begin

  9    v_ename := 'zhangxf';

 10    v_sal := 4000;

 11    v_balance := 10000;

 12    v_hiredate := sysdate-720;

 13    v_valid := true;

 14    dbms_output.put_line(v_ename);

 15    dbms_output.put_line(v_sal||'  '||v_balance);

 16    dbms_output.put_line(c_tax_rate);

 17    dbms_output.put_line(to_char(v_hiredate,'yyyy-mm-dd'));

 18    --dbms_output.put_line(to_char(v_valid));

 19* end;

SQL> /

zhangxf

4000  1.0E+004

5.8

2006-06-02

3 使用%TYPE类型

当定义PL/SQL变量存放列值时,必须确保变量使用合适的数据类型和长度,否则运行过程中可能会出现PL/SQL运行错误。为了了避免这种不必要的错误,可以使用%TYPE属性定义变量。当使用%TYPE属性定义变量时,它会按照数据库列或其他变量来确定新变量的类型和长度.

SQL> ed

已写入 file afiedt.buf

 

  1  declare

  2    v_ename test3.name%TYPE;

  3    v_sal test3.salary%TYPE;

  4  begin

  5    select name,salary into v_ename,v_sal from test3 where id=1;

  6    dbms_output.put_line(v_ename||'  '||v_sal);

  7* end;

SQL> /

zxf  20000

 

PL/SQL 过程已成功完成。

 

3.2.2复合变量

复合变量是指用于存放多个值的变量。当定义复合变量时,必须要使用PL/SQL的复合数据类型。PL/SQL包括PL/SQL记录,PL/SQL表,嵌套表以及VARRAY等四种复合数据类型。

1.       PL/SQL记录

PL/SQL记录类似于高级语言中的结构,每个PL/SQL记录一般都包括多个成员。当使用PL/SQL记录时,首先需要在定义部分记录类型和记录变量,然后在执行部分引用该记录变量。×××当引用记录成员时,必须要加记录变量作为前缀

如下:

--创建示例表

SQL> create table emp(empno int,ename varchar2(20),sal number(8,2),job varchar2(20));

表已创建。

SQL> insert into emp values(7788,'zxf',2000,'it manager');

已创建 1 行。

SQL> insert into emp values(8256,'llll1000,'dba’);

已创建 1 行。

 

SQL> commit;

提交完成。

--创建记录类型

declare

  type emp_record_type is record(

    name emp.ename%TYPE,

    salary emp.sal%TYPE,

    title emp.job%TYPE);

  emp_record emp_record_type;

begin

  select ename,sal,job into emp_record

  from emp where empno=7788;

  dbms_output.put_pine('雇员名:'||emprecord.name);

end;

/

 

2.       PL/SQL

PL/SQL表类似于高级语言中的数组,需要注意,PL/SQL表与高级语言的数组有所区别,◇高级语言数组的下标不能为负,但PL/SQL表的下标可以为负值;

◇高级语言数组的元素个数有限制,而PL/SQL表的元素个数没有限制,并且其下标没有上下限。

当使用PL/SQL表时,必须首先在定义部分定义PL/SQL表类型和PL/SQL表变量,然后在执行部分引用该PL/SQL表变量

示例如下:

SQL>

  1  declare

  2    type ename_table_type is TABLE OF emp.ename%TYPE

  3      index by binary_integer;

  4    ename_table ename_table_type;

  5  begin

  6    select ename into ename_table(-1) from emp where empno=7788;

  7    dbms_output.put_line('雇员名:'||ename_table(-1));

  8* end;

SQL> /

雇员名:zxf

PL/SQL 过程已成功完成。

 

3.       嵌套表

嵌套表(Nested Table)类似于高级语言中的数组,高级语言数组和嵌套表的下标都不能为负值;高级语言的元素个数是有限制的,而嵌套表的元素个数是没有限制的。

嵌套表和PL/SQL表非常类似,但嵌套表可以作为表列的数据类型,而PL/SQL表不能作为表列的数据类型。

当在表列中使用嵌套表时,必须首先使用create type语句建立嵌套表类型,如下:

SQL> create or replace type emp_type as object(

  2    name varchar2(10),

  3    salary number(6,2),

  4    empno int);

  5  /

 

类型已创建。

 

SQL> create or replace type emp_array is table of emp_type;

  2  /

 

类型已创建。

 

SQL> create table department(

  2    deptno number(2),

  3    dname varchar2(10),

  4    employee emp_array

  5  )nested table employee store as employee;

 

表已创建。

SQL>

对于嵌套表应再查看一下如何使用

 

4.       VARRAY

VARRAY类似于嵌套表,它可以作为表列和对像类型属性的数据类型,但嵌套表的元素个数没有限制,而VARRAY的元素个数是有限制的,当使用VARRAY时必须首先建立VARRAY类型。示例如下:

SQL> create type article_type as object(

  2  title varchar2(30),

  3  pubdate date

  4  );

  5  /

 

类型已创建。

 

SQL> create type article_array is varray(20) of article_type;

  2  /

 

类型已创建。

 

SQL> create table author(

  2  id number(6),

  3  name varchar2(10),

  4  article article_array

  5  );

表已创建。

 

3.2.3参照变量

参照变量是指用于存放数值指针的变量。通过使用参照变量,可以使得应用程序共享相同对像,从而降低占用空间。

在编写PL/SQL程序时,可以使用游标变量(REF CURSOR)和对像类型变量REF obj_type等两种参照变量类型。

1.       REF CURSOR

当使用显示游标时,需要定义显示游标时指

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/67668/viewspace-310011/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/67668/viewspace-310011/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值