PL/SQL-->语言基础

来源:互联网 发布:夏季凉鞋女款淘宝 编辑:程序博客网 时间:2024/05/04 21:09
PL/SQL --> 语言基础

   PL/SQL是过程化的SQL语言,是ORACLE对SQL语言的扩展,在普通SQL语句的基础上增加了编程语言的特点。使得该语言不仅具有过程编程语言的特征,如循环、条件分支等。同时也具有对象编程语言的特征,如重载、继承等。

一、PL/SQL程序语言的组成

    主要由块组成

       一个块由三个基本部分组成:声明、执行体、异常处理
       PL/SQL块有匿名块和命名块
       命名块会将代码保存到服务器
    
   典型的块结构如下

       [DECLARE                   --声明部分
           declaration_statements
       ]

       BEGIN
           executable_statements  --执行体部分

       [EXCEPTION
           exception_handling_statements   --异常处理部分
       ]
       END;
       /
    
   PL/SQL的语言优点

       支持SQL
       高生成率,性能好
       可移植性
       与Oracle集成
      
二、PL/SQL的语法要素

   PL/SQL语法要素包括字符集、标识符、文本、分隔符、注释等。

    字符集:

       包括英文大小写字母
       0-数字
       空白符、制表符、空格
       一些特殊符号,如~、!、@、#等
       PL/SQL字符集不区分大小写
    
    标识符:

       变量、常量、子程序的名称
       以字母开头、最大长度个字符
       包含空格等特殊符号时,要用英文双引号括起来
 
    文本

       数值型
           可用常规表示,也可以用科学计数法和幂的形式

       字符型
           字符型用单引号括起
       日期型
       布尔型
           TRUE、FALSE、NULL
           
   PL/SQL的数据类型

       NUMBER    数字型能存放整数值和实数值,并且可以定义精度和取值范围

           DEC   数字型NUMBER的子类型,小数
           DOUBLEPRECISION    数字型NUMBER的子类型,高精度实数
           INTEGER    数字型NUMBER的子类型,整数
           INT        数字型NUMBER的子类型,整数
           NUMERIC    数字型NUMBER的子类型,与NUMBER等价
           REAL       数字型NUMBER的子类型,与NUMBER等价
        SMALLINT   数字型NUMBER的子类型,取值范围比INTEGER小

     BINARY_INTEGER  数字型可存储带符号整数,为整数计算优化性能
     VARCHAR2       字符型存放可变长字符串,有最大长度
     CHAR       字符型定长字符串
     LONG       字符型变长字符串,最大长度可达32,767
     DATE       日期型以数据库相同的格式存放日期值
     BOOLEAN    布尔型TRUE OR FALSE
      ROWIDROWID 存放数据库的行号
       LOB类型,又分为BFILE,BLOB,CLOB,NCLOB       

    操作符

       算术运算符
           +、-、*、/、**
 
       比较运算符
           =、<>、~=、!=、^=、<、<=、>、>=

       其它分隔符

           ()、
         := (赋值)、
         ,(表项的分隔)、
         ||(字符串连接)
           << (标号开始)
         >> (标号的结束)
           --  单行注释
               多行注释
            属性指示器,一般与TYPE、ROWTYPE等一起用
     
三、定义变量

   变量的类型可以分为

       标量类型
       复合类型
       参照类型
       LOB 类型
    
   1.标量类型(常用)

       varchar2(n),char(n),number(p,s),date,timestamp,long(longraw),boolean,binary_integer,binary_float,binary_double

       定义方法(定义时必须使用标量类型)

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

       v_ename    varchar2(20);
       v_sal      number(6,2);
       c_tax_rate  constant number(3,2):=3.35;
       v_hiredate  date;
       v_valid    boolean not null default false;
       v_enameemp.ename%type;   --使用表列来定义数据类型
       v_sal   emp.sal%type;
       
   2.复合类型(存放多个值的变量)

       plsql中包含pl/sql记录,pl/sql表,嵌套表,varray四种复合类型

       --定义PL/SQL记录

           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 scott.emp where empno=7788;
               dbms_output.put_line('Employee Name: ' || emp_record.name);
           end;
           /

       --定义PL/SQL表

           declare
               type ename_table_type is table of emp.ename%type
               index by binary_integer;
               ename_table ename_table_type;
           begin
               select ename into ename_table(-1) from scott.emp
               where empno=7788;
               dbms_output.put_line('Employee Name : '|| ename_table(-1));
           end;
           /

           PL/SQL表类似于高级语言中的数组,且PL/SQL表的下标可以为负值,元素的个数没有限制.注意必须首先定义PL/SQL表类型及表变量
           在本例中,ename_table_type为表类型,表类型中元素的数据类型为emp.ename%type,
               ename_table为表变量,ename_table(-1)表示下标为-1的元素

       --嵌套表,varray例子略
       
   3.参照类型变量

       用于存放数值指针的变量。通常包括游标变量(REF CURSOR)和对象类型变量(REF obj_type)

   4.LOB变量

       存储大批量数据的变量,通常分为内部LOB以及外部LOB

   5.使用SQL*Plus变量

       必须首先使用variable命令定义变量,如在SQL*Plus中输出变量,则使用print variable_name

           scott@ORCL> var name varchar2(20);
           scott@ORCL> begin
              select ename into :name from emp whereempno=7788;
              end;
              /

           PL/SQL procedure successfully completed.

           scott@ORCL> print name;

           NAME
           --------------------------------
           SCOTT      

三、PL/SQL中常用的变量赋值方式

   1.在定义时赋值

       v_empno    number:=7788
       c_tax_rate  constant number(3,2):=3.35;
    
    2.使用select... into 来赋值

       SELECT expression INTO var_list FROM table_name WHEREcondition

       --例:将10号部门的名称和工作地点显示出来

           DECLARE
               v_name dept.dname%TYPE;
               v_loc   dept.loc%TYPE;
           BEGIN
               select dname,loc INTO v_name,v_loc FROM dept WHERE deptno=10;
               DBMS_OUTPUT.PUT_LINE('10 DEPT NAME: '||v_name);
               DBMS_OUTPUT.PUT_LINE('10 DEPT loc: '||v_loc);
           EXCEPTION
               WHEN NO_DATA_FOUND THEN
                   DBMS_OUTPUT.PUT_LINE('NOT FOUND RECORD');
           END;
           /

       --例:输入员工编号,查询员工姓名,职位,工资

           scott@ORCL> DECLARE
                     v_name  emp.ename%TYPE;
                     v_job   emp.job%TYPE;
                     v_sal  emp.sal%TYPE;
                     v_id   emp.empno%TYPE;
                   BEGIN
                     v_id:=&inputid;
                     SELECT ename,job,sal INTO v_name,v_job,v_sal FROM emp WHEREempno=v_id;
                     DBMS_OUTPUT.PUT_LINE('7788 NAME:'||v_name);
            10         DBMS_OUTPUT.PUT_LINE('7788 job:'||v_job);
            11         DBMS_OUTPUT.PUT_LINE('7788 sal:'||v_sal);
            12       EXCEPTION
            13         WHEN NO_DATA_FOUND THEN
            14           DBMS_OUTPUT.PUT_LINE('NOT FOUND RECORD!');
            15       END;
            16  /

           Enter value for inputid: 7788
           old  7:        v_id:=&inputid;
           new  7:        v_id:=7788;
           7788 NAME:SCOTT
           7788 job:ANALYST
           7788 sal:3000

           PL/SQL procedure successfully completed.  

       --例:执行UPDATE

           scott@ORCL> DECLARE
                   v_sal emp.sal%TYPE;
                   old_sal emp.sal%TYPE;
                   v_id emp.empno%TYPE;
                 BEGIN
                   v_sal:=&inputsal;
                   v_id:=&inputid;
                   SELECT sal INTO old_sal FROM emp WHERE empno=v_id;
                   UPDATE emp SET sal=v_sal WHERE empno=v_id;
            10       DBMS_OUTPUT.PUT_LINE('old sal:'||old_sal);
            11       DBMS_OUTPUT.PUT_LINE('new sal:'||v_sal);
            12     END;
            13     /

           Enter value for inputsal: 3500

           old  6:      v_sal:=&inputsal;
           new  6:      v_sal:=3500;
           Enter value for inputid: 7788
           old  7:      v_id:=&inputid;
           new  7:      v_id:=7788;
           old sal:3000
           new sal:3500

           PL/SQL procedure successfully completed.
         
转自:http://blog.csdn.net/robinson_0612/article/details/6063399
0 0
原创粉丝点击