PL/SQL --> 语言基础

--=====================

-- PL/SQL --> 语言基础

--=====================

 

    PL/SQL是过程化的SQL语言,是ORACLESQL语言的扩展,在普通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字符集不区分大小写

   

    标识符:

        变量、常量、子程序的名称

        以字母开头、最大长度个字符

        包含空格等特殊符号时,要用英文双引号括起来

 

    文字

        数值型

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

        字符型

            字符型用单引号括起

        日期型

        布尔型

            TRUEFALSENULL

           

    PL/SQL的数据类型

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

            DEC    数字型NUMBER的子类型,小数

            DOUBLE PRECISION     数字型NUMBER的子类型,高精度实数

            INTEGER     数字型NUMBER的子类型,整数

            INT         数字型NUMBER的子类型,整数

            NUMERIC     数字型NUMBER的子类型,与NUMBER等价

            REAL        数字型NUMBER的子类型,与NUMBER等价

          SMALLINT    数字型NUMBER的子类型,取值范围比INTEGER

      BINARY_INTEGER  数字型可存储带符号整数,为整数计算优化性能

      VARCHAR2        字符型存放可变长字符串,有最大长度

      CHAR        字符型定长字符串

      LONG        字符型变长字符串,最大长度可达,767

      DATE        日期型以数据库相同的格式存放日期值

      BOOLEAN     布尔型TRUE OR FALSE

      ROWID ROWID 存放数据库的行号

        LOB类型,又分为BFILE,BLOB,CLOB,NCLOB

       

    操作符

        算术运算符

            +、-、*、/、**

 

        比较运算符

            =、<>~=!= ^=<<=>>=

 

        其它分隔符

            ():= (赋值)、,(表表项的分隔)、| |(字符串连接)

            << (标号开始) >> (标号的结束)

            --  单行注释

            /*    */    多行注释

            %   属性指示器,一般与TYPEROWTYPE等一起用

       

三、定义变量

    变量的类型可以分为

        标量类型

        复合类型

        参照类型

        LOB 类型

   

    1.标量类型(常用)

        varchar2(n),char(n),number(p,s),date,timestamp,long(long raw),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_ename emp.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

              2  select ename into :name from emp where empno=7788;

              3  end;

              4  /

 

            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 WHERE condition

       

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

 

            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

              2          v_name  emp.ename%TYPE;

              3          v_job   emp.job%TYPE;

              4          v_sal  emp.sal%TYPE;

              5          v_id    emp.empno%TYPE;

              6        BEGIN

              7          v_id:=&inputid;

              8          SELECT ename,job,sal INTO v_name,v_job,v_sal FROM emp WHERE empno=v_id;

              9          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

              2        v_sal emp.sal%TYPE;

              3        old_sal emp.sal%TYPE;

              4        v_id emp.empno%TYPE;

              5      BEGIN

              6        v_sal:=&inputsal;

                  v_id:=&inputid;

              7        v_id:=&inputid;

              8        SELECT sal INTO old_sal FROM emp WHERE empno=v_id;

              9        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.

 

四、更多参考

 

    有关SQL请参考 

        SQL 基础--> 子查询

        SQL 基础-->多表查询

SQL基础-->分组与分组函数

SQL 基础-->常用函数

SQL 基础--> ROLLUP与CUBE运算符实现数据汇总

SQL基础-->层次化查询(START BY ... CONNECT BY PRIOR)

 

    有关PL/SQL请参考

        PL/SQL --> 语言基础

PL/SQL --> 流程控制

PL/SQL --> 存储过程

PL/SQL --> 函数

PL/SQL --> 游标

PL/SQL -->隐式游标(SQL%FOUND)

PL/SQL --> 异常处理(Exception)

PL/SQL --> PL/SQL记录

PL/SQL --> 包的创建与管理

PL/SQL --> 包重载、初始化

PL/SQL --> DBMS_DDL包的使用

PL/SQL --> DML 触发器

PL/SQL --> INSTEAD OF 触发器

 

 

 

 

posted @ 2010-12-08 16:35  生活不是用来挥霍的  阅读(222)  评论(0编辑  收藏  举报