1. 编写PL/SQL程序代码之前必须确认的事情是:
授予用户create procedure权限,使其可以在模式中创建PL/SQL程序
在可能编写的PL/SQL程序的任意模式中的数据库对象上,直接授予select、update、delete、insert权限。
如果要创建数据库级的触发器,必须具有admininstr database trigger的权限。
确认system表空间中有足够的空间存放PL/SQL程序,PL/SQL程序在system表空间中产生相应的数据字典内容。
确认系统全局区中的共享和私有SQL有足够的空间,以便可以处理运行PL/SQL程序运行所产生的负载。
疑问?系统全局区是什么东东?
2. 前面看的都给忘了,呵呵,在写一遍,为被锁的用户进行解锁的命令
Alter user Scott identified by tiger account unlock;
3. PL/SQL程序都以块作为基本单位,块的分类:
匿名块:动态生成,只能执行一次,不存储在数据库中
命名块:一种带有标签的块,标签为块指定了一个名称
子程序:是可以存储在数据库中producer、function、package的集合体,可以在外部程序中通过调用来执行。
触发器:存储在数据库中一种带名块,当相应的触发时间发生时就被自动执行
4. PL/SQL程序结构由3个部分组成declarative section、excutable section、exception section组成。
Declaration section是以declare开始的,在该部分定义程序中要使用的变量、常量、函数、游标、异常处理名称等。PL/SQL程序要使用的所有定义都必须在声明部分中进行集中定义。
Excutable section是begin开始,以end结束,包含了各种流程控制语句和对数据库的操作语句。
Exception section是包含在执行部分里,以exception开始,以end结束,对程序中产生的异常进行处理,从而提高程序的健壮性。
5. PL/SQL语言字符集、常用符号包括:常用字符集、分界符、标识符、保留字、预定义标识符、文字、布尔文字、日期文字、注释、
6. PL/SQL常量和变量的声明:
Identifier_name constant data_type not null := value_expression
变量名 是否常量 数据类型 是否为空 常量变量的值
作用域:变量的作用域从变量的声明开始直到当前块的结束为止,在一个块中声明的变量为局部变量,在一个块外声明的变量为全局变量,引用块内的局部变量不需要添加限定词,但是引用块外的全局变量需要添加限定词。只能在子块中引用父块的变量,不能在父块中引用子块的变量,并且子块不能应用另一个子块定义的变量。
get f:\oracle\vfield.sql;
<<block1>>
declare
v_1 varchar(20) := 'global v1';
begin
DBMS_OUTPUT.PUT_LINE(v_1);
<<subblock1>>
declare
v_1 varchar(20) := 'subblock1 loacl v_1';
begin
DBMS_OUTPUT.PUT_LINE(v_1);
DBMS_OUTPUT.PUT_LINE(block1.v_1);
end;
<<subblock2>>
declare
v_1 varchar(20) := 'subblock2 local v_1';
begin
DBMS_OUTPUT.PUT_LINE(v_1);
DBMS_OUTPUT.PUT_LINE(subblock1.v_1);
END;
END;
global v1
subblock1 loacl v_1
global v1
subblock2 local v_1
global v1
7. PL/SQL数据类型包括number(p,s)p表示精度,表示数字的总位数;s表示刻度,表示小数点后一共有多少位。
Char(n);
Varchar2(n);
Boolean取值范围是false、true、null
Date;
Timestamps;存储了年、月、日、时、分、秒,还包括了上午、下午,同时还包括秒的小数精度。
疑问:Interval year(y) to month用于存储和操纵年和月之间的时间间隔。其中y是可选的,表示年部分的位数,取值范围0~4,默认是2。怎么用?没懂!
类似的函数 interval day(d) to second(s) second;用于存储和操纵天数、小时、分钟和秒之间的时间间隔。其中d和s是可选的,d表示天部分用几位数字表示,s表示秒部分的位数,取值范围0~9,默认值分别是2和6。
Lob数据类型提供了blob、clob、bfile,用来存储最大尺寸为4GB的无结构大数据块。Blob常用来保存包含图片、图像的大文件、资料。Clob用来保存只有文本的大文件。Bfile用来保存声音、视频等。
%type使一个变量的数据类型与另一个已经定义的变量的数据类型一致。这样可以保证当被参照的变量的数据类型发生变化之后,新定义的变量的数据类型也会发生变化。
%rowtype为了使一个变量的数据类型与一个参照表的某些字段数据类型相对应相一致。同时在定义一个变量使用是%rowtype之后,则该变量相当于定义了一个表,并且和被参照表是完全一样的。
SQL> get f:\oracle\rowtype.sql;
1 declare
2 v_emp emp%rowtype;
3 begin
4 select * into v_emp
5 from emp
6 where empno = &eno;
7 dbms_output.put_line('雇员名'||v_emp.ename);
8 dbms_output.put_line('工资'||v_emp.sal);
9 dbms_output.put_line('岗位'||v_emp.job);
10* end;
SQL> /
输入 eno 的值: 7788
原值 6: where empno = &eno;
新值 6: where empno = 7788;
雇员名SCOTT
工资3000
岗位ANALYST
PL/SQL 过程已成功完成。
Record定义记录类型。类似于c语言中结构化类型。将相关的、分离的基本数据类型的变量组成一个整体就叫做record类型。在使用record类型变量的时候,首先要在声明部分先定义记录的组成和记录变量,然后在执行部分引用该记录变量本身或其中的成员。Type record_type is record(v1 data_type1;v2 data_type2;v3 data_type3)
举例:
SQL> get f:\oracle\record.sql;
1 declare
2 type emp_record_type is record(
3 name emp.ename%type,
4 salary emp.sal%type,
5 job emp.job%type);
6 emp_record emp_record_type;
7 begin
8 select ename,sal,job into emp_record
9 from emp
10 where empno = &eno;
11 dbms_output.put_line('雇员名:'||emp_record.name);
12 dbms_output.put_line('工资:'||emp_record.salary);
13 dbms_output.put_line('岗位:'||emp_record.job);
14* end;
SQL> /
输入 eno 的值: 7788
原值 10: where empno = &eno;
新值 10: where empno = 7788;
雇员名:SCOTT
工资:3000
岗位:ANALYST
PL/SQL 过程已成功完成。
疑问:Table:定义表类型,类似于c语言中的数组,PL/SQL提供了将几个相同的基本数据类型的变量组成一维表、用下标来访问的方法。再使用表类型变量的时候,需要在声明部分先定义表、表变量,然后在程序执行部分引用该记录变量本身或其成员。
Type table_type is table of data_type index by binary_integer;
名称 数据类型