一,PLSQL有那些知识点:
         1,PLSQL背景
         2,PLSQL程序结构
         3,变量与数据类型
        4,运算符
        5,PLSQL控制语句
        6,PLSQL游标
        7,HANDLE EXCEPTION
        8,SUB PROGRAM
                1,PROCEDURE
                2,FUNCTION
        9,PACKAGE
        10,TRIFFER

二,PLSQL简介
        PLSQL(Procedural Language/SQL)是再标准SQL的基础上增加啦过程化处理的语言。结构化模块化编程,良好的可移植性,良好的可维护性,提升系统性能。做什么,不管怎么做,缺少过程与控制语句,无算法描述能力。相比SQL扩展了变量和类型,控制结构,过程与函数,对象类型与方法。
        PLSQL开发环境:
                SQLPlus utility
                GUI Develop Tools:
                        - Toad
                        - PLSQL Developer
        PLSQL字符集
                字母:A-Z,a-z
                数字:0-9
                空白:Tab Space,回车
                符号:+_*/<>;:'@"%||&-/**/
               PLSQL对大小写不敏感。
               只有DML SQL可以直接在PLSQl中使用
               使用ORACLE内置的DBMS_SQL包,可以使用动态SQL语句-动态SQL语句是在运行时生成一 个SQL串,将该喘提交给DBMS_SQL包来执行。
               内置的SQL函数也能执行。 

三,PLSQL程序结构
        PLSQL块
               -申明部分,DECLARE
               - 执行部分,BEGIN
               - 异常部分,EXCEPTION
 例子:

DECLARE
                 v_StudentID NUMBER(5) := 1000;
                 v_FirstName VARCHAR(20);
         BEGIN
                 SELECT first_name
                  INTO v_FirstName
                 FORM students
                 WHERE id = v_StudentID;
  EXCEPTION
                 WHEN NO_DATA_FOUND THEN
                 INSERT INTO log_table(info)
          VALUES('Student 1000 does not exist!');
  END;

是用sqlcode和sqlnum关键字来获得错误信息.

四,变量与数据类型
        变量:
         变量命名规则:字母开头,后跟任意的非空格字符,数字,货币符号,下划线或#,最大长度为30个字符。
  变量命名约定:变量一v开头(v_VariableName),类型以t开头(t_TypeName),异常以e开头(e_ExceptionName),参数以p开头(p_ParameterName).
        数据类型:
                字面值:123 --数字;'123' 'hello' --字符串;TRUE FALSE --布尔;‘30-NOV-1992, 3:17 PM’-- 日期型
                标量型:-数字,字符,布尔,日期
                组 合:-RECORD,TABLE,VARRAY
                参考型:(引用型)-REF CURSOR,REF OBJECT_TYPE;
                L O B :----
        1,标量类型(常用的)
                NUMBER CHAR VARCHAR2,BOOLEAN,DATE
                %TYPE:变量具有与数据库的表中的某以字段相同的类型。
          例子:
                  1, v_FirstName VARCHAR2(20);
                  2, v_FirstName students.first_name%TYPE;
        2,组合类型
   

1,RECORD
                        TYPE record_name IS RECORD(
                                fild1 type1 [NOTNULL][:=expr1],
                                fild2 type2 [NOTNULL][:=expr2],
                                ...
                                fildn typen [NOTNULL][:=exprn]
                        );


          如果一个字段没有限定NOT NULL,那么它必须由一个初始值。
   所有没有初始化的字段都会初始化为NULL。
   同类型的RECORD变量可以相互赋值。
   也可以取其中的字段(recode_name.field_name)
   查信表时,用SELECT * INTO V_RecodeName赋值,字段类型合顺序要一样。
         2,%ROWTYPE
                 取表行的类型,相当与一个RECORD类型。
                 数据库名%ROWTYPE
                 例子:
                  DECLARE
                   v_StuRec Student%ROWTYPE --Student时表名。
         3,TABLE
                 相当于map<int,T>
                 TYPE tabletype IS TABLE OF type INDEX BY BINARY_INTEGER;
                 表中的元素的类型可以时符合类型
                 行的数目的限制由BINARY_INTEGER的范围决定
                 KEY没有必要是随序的
                 当数据被插入表时,表锁需的空间就被分配了
                 例子:
   

DECLARE
                   TYPE t_StuTable IS TABLE OF Student%ROWTYPE INDEX
                   BY BINARY_INTEGER;
                   v_Student t_StuTable;
                  BEGIN
                   SELECT * INTO v_Student(1001)
                   FROM Student WHERE id = 1001;
                  END;


         变量的作用于为从声明到END,且,内嵌的过程可以改变外部变量的值,内嵌过程的变量不能再外部过程中使用。
 

DECLARE
                   v_Num NUMBER(5,2);
           BEGIN
                   v_Num := 123.45;
            DECLARE
                    v_Ch VARCHAR2(10);
            BEGIN
                    v_Num := 321.45;(内嵌的过程可以改变外部变量的值)
                    v_Ch := 'hello';
                   ...
                   END;
                   -- v_Ch := 'good';(内嵌过程的变量不能再外部过程中使用)
                  ...
           END;


       五,运算符
               =  判断
               :=  赋值
               <> != ^=  不等于
               ||  字符连接符
               ;  语句结束
               <<label_name>> 设置标签
               -- /**/  注释
               AND
               OR
               NOT
      六,PLSQL控制语句
      1,IF语句
   

IF boolean_expression1 THEN
                 ...
                  ELSEIF boolean_expression2 THEN
                 ...
                ESLE
                 ...
                END IF;


               条件为NULL于FALSE相同。
        2,简单的循环语句
                a,LOOP循环
                 LOOP
                                ...
                                IF boolean_expression THEN
                                 EXIT;
                                END IF;
                                --EXIT WHEN boolean_experssion;
                 END LOOP;
         b,WHILE循环
                 WHILE boolean_expression LOOP
                        ...
                 END LOOP;
         c,FOR循环
                FOR loop_counter IN [REVERSE] low_bound..high_bound LOOP
                         ...
                 END LOOP;
                 变量不用在DECLEAR中声明,第一次循环会取low_bound。
         d,GOTO语句
                 GOTO label_name;
                 只能由内部的语句块跳往外部块。
                 设置标签
                  <<label_name>>
         e,NULL语句
                 可以在语句块中加空语句,用于补充语句的完整性。
                 IF v_idx > 40 THEN
                         ...
                  ELSE
                         NULL;
                 END IF;
  七,PLSQL游标
               CURSOR用于提取多行数据集。涉及的操作有:声明游标;为查询打开游标;将结果提 取  出来,存入PLSQL变量中;关闭游标。
               DECLARE
                       CURSOR cursor_name IS select_statement。
 .                     ..
               例子:

DECLARE
                        v_major students.major%TYPE;
                        CURSOR c_student IS 
                  SELECT first_name,last_name
                  FROM students
                  WHERE major = v_major;


          1,OPEN CURSOR
                OPEN cursor_name;
                Lock if select statement has "FOR UPDATE"。
        2,FETCH FROM CURSOR
                       FRTCH有两种型式
                        - FETCH cursoR_name INTO var1, var2...;
                        - FETCH cursor_name INTO record_var;
        3,CLOSE CURSOR
                CLOSE cursor_name;
                游标使用后应该关闭
                 -FETCH关闭后的游标是非法的。
                 -关闭一个关闭了的游标也是非法的。
        4,游标的属性

-%FOUND
                -%NOTFOUND
                -%ISOPEN
                -%ROWCOUNT
                DEMO:
                 ...
                 EXIT WHEN cursor_name%NOTFOUND;
                 ...


         5,游标的FETCH循环
  

-LOOP
                 FETCH cursor INTO...
                 EXIT WHEN cursor_name%NOTFOUND;
                END LOOP
                -WHILE cursor_name%FOUND LOOP
                 FETCH cursor INTO
                END LOOP;
                -FOR var IN cursor_name LOOP
                 --print var;
                END LOOP;


       6,带参数的游标
                CURSOR可以带参数。
     

DECLARE
                        CURSOR c_student(p_major) students.major%TYPE)
                        SELECT * FROM students
                        WHERE major = p_major;
                BEGIN
                        OPEN c_student(101);
                       ...


                多参数用‘,’隔开。
八,EXCEPTION
        PLSQL有编译时错误,和运行时异常。
        运行时异常类型:
         1,异常处理块

DECLARE
                         ...
                 BEGIN
                         ...
                 EXCEPTION
                         WHEN OTHERS THEN
                                 handler_error(...);
                 END;


         2,用户自定义异常

DECLARE
                         e_TooManyStudents EXCEPTION;
                         . ..
                 BEGIN
                         ...
                         RAISE e_TooManyStudents;
                         ...
                 EXCEPTION
                         WHEN e_TooManyStudents THEN
                          ...
                 END;


        3,预定义的ORACLE异常
                        有ORACLE预定义的异常代码
                 如:
                  ORA-0001 - DUP_VAL_ON_INDEX --资源重复
               异常操作
                1,触发异常--抛出异常
                        RAISE exception_variable;
                       2,捕捉异常
 

EXCEPTION
                         WHEN e_TooManyStudents THEN
                          INSERT INTO log_file(info)
                          VALUES('Major 1100 has '|| 
                           v_CurStudents || 'max aloowed is' || v_Max);
                  WHEN OTHERS THEN --捕捉所有异常。
                          v_ErrCode := SQLCODE;
                                 ...
                 END;


九,SUB PROGRAM
        ×匿名块
                -匿名块不存在数据库中
                -每次使用时都会进行编译
                -不能在其他块中调用
        ×带名块
                -带名块存储在数据库中
                -可以在任何需要的地方调用
                -PROCEDURE,FUNCTION,PACKAGE,TRIGGER
        1,PROCEDURE

CREATE [OR REPLACE] PROCEDURE procd_name
                        [(arg_name [{IN | OUT | IN OUT}] TYPE,
                        ...
                 arg_name [{IN | OUT | IN OUT}] TYPE)]
                {IS | AS}
                procedure_body


                不要制定参数的长度如:varchar2(10)
                a,PROCEDURE的参数模式
                 ×IN
                         -在调用过程中,实际参数的值被
                         传递给该过程,形参时只读的。
                 ×OUT
                         -在调用过程中,任何的参数将被
                         忽略;在过程内部,形参时可写的。
                 ×IN OUT
                         -是IN与OUT的组合,在调用过程的时
                         候,实参的值可以传递给该过程,在
                         过程内部,形参也可以被读出也可以
                         被写入,过程结束时,控制返回给控
                         制环境,而形参的内容将赋给调用时
                         的实际参数。****
                 ×参数的缺省模式是IN.
         b,过程主体
                  ×过程主体是一个拥有声明,执行和异常处理的完整的PLSQL块。
                 ×声明部在IS或AS关键字与BEGIN关键字之间。
                 ×执行部分在BEGIN和EXCEPTION之间。
                 ×异常部分在EXCEPTION与END之间。
                 例子:
     

CREATE OR REPLACE PROCEDURE ModeTest(
                          p_InParm IN NUMBER := 10,
                          p_OutParm OUT NUMBER,
                          p_InOut IN OUT NUMBER)
                  IS
                          v_LocaVar NUMBER;
                          ...
                  BEGIN
                          v_LocaVar := p_InParm;
                          p_OutParm := p_InParm;
                          ...
                  EXCEPTION
                   WHEN %NOFOUND THEN
                    ...
                  END ModeTest;


         c,调用PROCEDURE的例子
                        ...
              v    ModeTest(10,v_var1,v_var2);
                        ...
          ×指定实参的模式
           ×位置标示法
                  -调用的时候添入所有参数,
                   实参和形参按顺序一一对应。
           ×名字标示法
                   -调用时给出形参名字,并给出实参 
                           ModeTest(12,p_OutParm => v_var1,
                            p_InOut => 10);
           ×两种方法可以混用
                   -混用时,第一个参数必须通过位置
            来指定。
                   -名字标示法对于参数很多时,可提
                          高程序的可读性。
          ×使用缺省参数
                  -形参可以指明缺省值。
                  -位置标示法时,所有的缺省值都放在最后面
                  -使用名字标示法时无所谓
                  -如果使用了缺省值,尽量将缺省值放在参数的末尾。
        2,FUNCTION
                。。。
  十,PACKAGE
               。。。
  十一,PRIGGER
               。。。