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_curIS
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_CURSORd、用户自定义例外
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;