广州明生堂生物科技有限公司


Oracle初学者笔记(十二)--PL/SQL1_基础

网络编程 Oracle初学者笔记(十二)--PL/SQL1_基础 06-22

  PL/SQL的介绍

  PL/SQL:Procedural Language/SQL 过程SQL;

  是对SQL的扩展; PL/SQL中存在过程构造和数据库访问;在Oralce服务器和客户机应用程序中使用; 支持大型对象和集合; 实质是在过程语言中嵌入了SQL而不是相反; SQL可以对数据库进行处理,但是它是单条执行的,无法进行连续的处理,也就是说没有逻辑;

  特点:

  支持对象类型和集合; 调用外部函数和过程; 支持SQL; 支持OOP; 可以在Oracle各个版本间移植,与Oracle集成在一起;

  PL/SQL执行原理

  PL/SQL块: 包括一组语句: 声明部分:所有变量的声明; 可执行部分:必须有;异常处理部分;

  结构:

       Declare

              Declarations //声明区域

       Degin

              Executable statements

       Exception

              Handlers;  //如果没有这个处理语句,则会交给系统处理,类似给虚拟机;

       End;

实例:

       Declare

              Eno emp.empno%type;

              Name emp.ename%type;

       Begin

              Select empno,ename into eno,name from  emp where empno=8933;

              Dbms_output.put_line(‘empno:’||eno||’   ‘||’ename:’||name);

       Exception

              When no_data_found then

                     Dbms_output.put_line(‘没有数据’);

       End;

  出现错误后,错误后的语句不再执行,跳转到错误处理块执行;

  变量的定义

  变量是数据的临时存储; 可直接对其赋值; 数据类型:

  内置数据类型:

  标量:一般数据类型,容纳单个值,number(38位),character(有个long子类型),date,boolean(不能用来定义字段)

  复合:可变数组,对象类型;record,varray,nested table; 

              引用:类似游标 ref cursor;

              LOB:大型对象类型

*****SQL-Plus的回显服务器端信息的命令:set serveroutput on

SQL> r

  1  declare

  2    eno varchar(10):='000';

  3    ename varchar(20);

  4    isExisted boolean default false;

  5    empName constant varchar(10):='Mike';

  6  begin

  7    eno:='7890';

  8    ename:='smith';

          Dbms_output.put_line(‘eno=’||eno||’ ‘||’ename=’||ename);

  9* end;

eno=7890 ename=smith

PL/SQL 过程完成;

如果想动态输出数据库中的信息的话,可以在begin后面这样写:

       Select empno,ename to eno,ename from emp where empno=’7002’;

这里如果不加where 语句,则会抛出:实际返回的行数超出请求的行数异常;

SQL> r

  1  declare

  2   eno varchar(10):='000';

  3   ename varchar(20);

  4   isExisted boolean default false;

  5   empName constant varchar(10):='Mike';

  6   begin

  7      select empno,ename into eno,ename from emp;//这里没有where

  8      Dbms_output.put_line('eno='||eno||' '||'ename='||ename);

  9*  end;

declare

*

ERROR λÓÚµÚ 1 ÐÐ:

ORA-01422: ʵ¼Ê·µ»ØµÄÐÐÊý³¬³öÇëÇóµÄÐÐÊý

ORA-06512: ÔÚline 7

在SQL语句中对变量赋值用into,在SQL以外用 :=来赋值;

匿名PL/SQL程序块;

注释:--    /*   */;

属性

%type 引用数据库列

%rowtype 代表表中的行

也就是说为了防止发生定义的变量长度小于选择的数值长度的异常,我们用这两个属性来做为自适应的变量定义;

SQL> r

  1  declare

  2   eno emp.empno%type;

  3   ename emp.ename%type;  ---代表相应字段的类型

  4   emprow emp%rowtype;   --代表一行

  5   isExisted boolean default false;

  6   empName constant varchar(10):='Mike';

  7   begin

  8      select empno,ename into eno,ename from emp where empno=7902;

  9      select * into emprow from emp where empno=7788;   --使用emprow返回一行

 10      Dbms_output.put_line('eno='||eno||' '||'ename='||ename);

 11      dbms_output.put_line('empno:'||emprow.empno||'ename:'||emprow.ename);

 12*  end;

eno=7902 ename=FORD

empno:7788ename:SCOTT

PL/SQL ¹ý³ÌÒѳɹ¦Íê³É¡£

比较运算

Dbms_output.put_line('eno='||eno||' '||'ename='||ename);

只能输出字符型的,所以如果你要输出一个date型的,必须首先用to_char(date,’’)转换日期型数据,正如我们经常to_date(char,’’)一样;

SQL> r

  1  declare

  2    eno emp.empno%type;

  3    ename emp.ename%type;

  4    emprow emp%rowtype;

  5    thisday date;

  6  begin

  7    thisday:=sysdate;

  8    dbms_output.put_line('this is day:'||to_char(thisday,'YYYY-mm-dd'));

  9* end;

this is day:2005-10-24

比较日期的练习:

SQL> r

  1  declare

  2    eno emp.empno%type;

  3    ename emp.ename%type;

  4    emprow emp%rowtype;

  5    thisday date;

  6  begin

  7    thisday:=sysdate;

  8    if thisday>todate(‘2005-10-23’,’yyyy-mm-dd’) then

  9    dbms_output.put_line('this is day:'||to_char(thisday,'YYYY-mm-dd'));

 10    else

 11    dbms_output.put_line('this is kao');

 12    end if;

 13* end;

this is day:2005-10-24

控制语句

1,条件控制:f then ,if then else , if then elsif , case

语句块结束的时候必须写end if;

2,循环控制:

计算1加到100:


3,顺序控制:goto 不建议使用;

   Null :空语句;有时候暂时不想在需要有代码的地方编代码时用null语句就行;

  错误处理

  两重类型的异常:预定义的; 用户定义的;raise语句可手工引发异常;TMD跟Java一模一样;


编辑:广州明生堂生物科技有限公司

标签:语句,变量,类型,异常,定义