03、pl/sql小结

1、数据定义: 
      a number(7,2);
      a vachar2(20) :=’smith’;
 	%TYPE  My_name Employee.ename%TYPE;
 	用途就是不指定My_name的具体数据类型,当列ename列定义改变是,数据库运行时自动修改
 	%ROWTYPE --表示该类型为行数据类型,存储的是一行数据,一行数据里可以有多列,类似于表里的一行数据,也	可以是游标里的一行数据,如: vs_row1 表%rowtype; vs_row2 游标%rowtype;  
2、Plsql 块结构
 	DECLARE  说明变量和常量
 	BEGIN   在这里写执行语句或是其他语句快
 	EXCEPTION  处理错误或警告信息
 	END;
3、Plsql的记录类型:
	感觉像C的结构体,即方便的存储表的行信息:
 	定义:TYPE r_record is RECORD(
               v_ename emp.ename%TYPE,
               v_job emp.job%TYPE,);
	变量定义:r_emp   r_record;
	使用:   SELECT ename,job INTO r_emp FROM emp 
               WHERE empno=7934;
	给变量赋值:r_emp.v_ename:=’JACK’;
               r_emp.v_job:=’CLERK’;
4、plsql的TABLE类型
	感觉类似于C语言中的结构体数组
	定义方法:
	TYPE table_emp IS TABLE OF emp.ename %TYPE INDEX BY BINARY_INTEGER;
	--emp.ename %TYPE 是值类型 
	INDEX BY BINARY_INTEGER;--说的是key的类型!!!!
 	应用:
	my_name table_emp ;
	my_name(0):=’SCOTT’ ;
	my_name(1):=’SMITH’ ;
	SELECT ename INTO my_name(10) FROM emp WHERE empno = 7934;
5、INSERT语句要注意非空这个特性:
	Declare 
       v_ename EMP.ename%TYPE:=’DOG’;
       v_job VARCHAR2(15):=’MANAGER’;
	Begin 
      	 INSERT INTO emp(ename,job) VALUES(v_ename,v_job);
	END;
6、DELETE语句的使用:
	Declare
		v_empno EMP.empno%TYPE:=1234;
	BEGIN
 		DELETE FROM emp WHERE empno=v_empno;
	END;
7、事务处理
	它的意义在于可以在状态之间切换
	COMMIT;
	ROLLBACK;
	SAVEPOINT;
8、条件控制:
	a、IF 条件 THEN 语句;
     	   END IF
	b、IF 条件成立 THEN 执行语句1;
         ELSE 执行语句2;
	   END IF;
	c、IF 条件1成立 THEN 执行语句1;
	   ELSIF  条件2成立 THEN 执行语句2;
	   ELSIF 条件3成立 THEN 执行语句3;        
	   END IF;
9、基本循环:
	a、LOOP
               执行语句;
	   EXIT WHEN 条件成立;
	   END LOOP;
	b、WHILE 条件成立 LOOP
	  执行语句;
	  END LOOP;
	c、FOR 计数器IN 低界..高界 LOOP
	  执行语句;
	  END LOOP;
10、游标
	相当于指向数据表的指针
    游标的操作:
    a、命名光标:
               CURSOR emp_cur IS SELECT * FROM EMP;
    b、打开游标:
               OPEN emp_cur;
    c、取出记录:
               FETCH emp_cur INTO emp_rec;
    --FETCH语句检索活动集中的行,每次一行,每执行一次FECTCH,光标前进到活动集中的下一行。
    d、关闭光标:
               CLOSE emp_cur;
    注意:
    当然,你所声明的游标也不必要和数据表中的整条记录关联起来,也可以仅仅和其中的某些列关联,如下所示:
    CURSOR joke_feedback_cur

       IS

          SELECT J.name, R.laugh_volume, C.name

            FROM joke J, response R, comedian C

           WHERE J.joke_id = R.joke_id

             AND J.joker_id = C.joker_id;

在这里,上述游标实际上并不是作为一种指针与数据库中实际数据表相互作用,这个游标实际上是指向一个虚拟的 数据表或视图,这个虚拟的数据表或视图是由游标后面的SQL语句所表示。如果上述SQL语句返回了20条记录,那 么这个游标的功能就相当于一个指向这20条记录的指针。

11、游标属性:

a、%FOUND

属性反映了你最近对游标执行FETCH命令的状态。如果针对显式游标最近执行的FETCH命令返回了一条记录,则这 个属性为True;如果没有记录返回,则为False。

如果游标还没有打开,一个对%FOUND属性的引用就会引发一个INVALID_CURSOR(无效游标)的异常。你可以获 取每一个打开了的显式游标的%FOUND属性值。

在下面的范例中,是%FOUND属性最常用的方式,从游标中取记录,然后循环更新数据表,每一次循环开始时都要检 查游标中是否还有记录,如果没有的话就跳出循环。在更新数据表之后,又再一次检查游标的%FOUND属性,如果返 回为True,则显示接下来要更新的内容。

    OPEN caller_cur;

    LOOP

        FETCH caller_cur INTO caller_rec;

       EXIT WHEN NOT caller_cur%FOUND;

       UPDATE call

          SET caller_id = caller_rec.caller_id

        WHERE call_timestamp < SYSDATE;

       IF SQL%FOUND THEN

          DBMS_OUTPUT.PUT_LINE (

             'Calls updated for ' || caller_rec.caller_id);

       END IF;

    END LOOP;

    CLOSE caller_cur;

     b、 %NOTFOUND 如果无结果,返回true

      常用于结束循环:EXIT WHEN caller_cur%NOTFOUND;

  c、%ROWCOUNT性可以来确认有多少记录已经被提取。在处理了特定记录数之后,可以停止你的程序。

  d、%ISOPEN  如果游标是打开的,那么%ISOPEN属性返回True,否则返回False。

  练习:if   not  C%ISOPEN   then
       open C;
       end if;

  Loop
FETCH C INTO v_ename,v_sal;
EXIT WHEN  C%NOTFOUND;
END LOOP;

12、隐式游标:

属性:SQL%FOUND

           SQL%NOTFOUND

SQL%ROWCOUNT 

例子:Begin

             Update emp

             set sal=1200 where empno=1234;

             if SQL%NOTFOUND then insert into Errors(empno,sal)  

                 values (1234,1200);

             end if;

           End;

将没能成功修改的数据保存到Errors表中。

13、例外处理

            a、警告、出错、返回信息统称为例外

            b、分为:oracle预定义例外和用户自定义例外

         c、预定义例外

CURSOR_ALREADY_OPEN         VALUE_ERROR
NO_DATA_FOUND                        INVALID_NUMBER
TOO_MANY_ROWS                       ZERO_DIVIDE
INVALID_CURSOR

     d、用户自定义例外

          e、在DECLARE 中声明  

             out_of_range       EXCEPTION;
 	   例如:
            在Begin段中用RAISE引起,
            if  v_sal >MAX_SAL then   RAISE out_of_range;
            在EXCEPTION段中使用
            Exception
                    When  NO_DATA_FOUND                THEN   …
                    When  CURSOR_ALREADY_OPEN THEN
                    When  TOO_MANY_ROWS               THEN   ...
                                                       When              OTHERS                      THEN  ...

            END;
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值