一.常见的访问oracle的技术
PLSQL 过程化sql (procedure)
proc/c++ 使用c或者c++ 访问oracle数据库
ODBC/ADO vc中访问数据库的技术
SQLJ/JDBC java 访问oracle的技术
OCI oracle底层连接接口
二.plsql的特点
结构化 模块化编程
良好的可维护性
良好的可移植性 9i 10g 11g
提升系统的性能
不编译向异构数据库移植
(sqlserver mysql 存储过程)
三.plsql 扩展了 sql
变量和类型
控制结构 if for goto
过程和 函数
对象和 方法
四.plsql 的程序结构
declare
/* 声明区 申明区
声明变量 定义类型 */
begin
/* 执行区
执行sql语句 或者 plsql语句 */
exception
/* 异常处理区
当程序出错时 自动转入异常处理区*/
end;
/
五.第一个plsql程序
begin
dbms_output.put_line('hello plsql!');
end;
/
set serveroutput on;
开发工具:
sqlplus
sqlprogrammer
plsqldeveloper
六.变量
6.1 标识符
给变量 类型 函数 过程 等命名的。
6.2 变量
declare
变量名 类型;
begin
declare
var_x number;
begin
如果一个变量没有赋值 则这个变量的
值一定是NULL值。
6.3 如何给变量赋值
初始化和赋值 都使用 :=
declare
var_x number;
begin
var_x:=100;
dbms_output.put_line('var_x='||
var_x);
end;
/
定义一个字符串类型的变量 长度是30
给这个变量赋值成 hello 最后打印
这个变量的值。
declare
var_name varchar2(30);
begin
var_name:='hello';
dbms_output.put_line('var_name='||
var_name);
end;
/
6.4 变量的修饰
变量名 constant 类型 not null:=值;
declare
var_name constant varchar2(30)
:='hello';
begin
-- var_name:='world';
dbms_output.put_line(var_name);
end;
/
declare
var_name varchar2(30) not null
:='abc';
begin
var_name:='test';
dbms_output.put_line(var_name);
end;
/
6.5 变量的类型
标量类型: char varchar2 number date
binary_integer boolean
组合类型: record table
参考类型: ref cursor
大类型:BLOB CLOB BFILE (了解)
(存储数据在服务器上的位置)
declare
var_ind binary_integer;
var_f boolean;
begin
var_ind:=10;
-- var_f:=true;
var_f:=false;
if var_f then
dbms_output.put_line(var_ind);
end if;
end;
/
七.plsql 扩展的类型的语法
7.1 定义两个变量 类型分别和s_emp
表中 first_name,salary的类型一致。
然后再把 id=1对应的两个字段的值
赋值给这两个变量 输出这两个变量的值。
declare
var_name varchar2(25);
var_sal number(11,2);
begin
var_name:='Carmen';
var_sal:=2500;
dbms_output.put_line(var_name||':'
||var_sal);
end;
/
7.2 表名.字段名%type 来直接获取字段
对应的类型。
declare
var_name s_emp.first_name%type;
var_sal s_emp.salary%type;
begin
select first_name,salary
into var_name,var_sal
from s_emp where id=2;
dbms_output.put_line(var_name||':'
||var_sal);
end;
/
7.3 把id=3的 id first_name salary
对应的值查询出来。放入一个类似于c
语言结构体类型的变量。(record )
7.3.1 record类型语法:
type 类型名 is record(
字段名1 类型,
字段名2 类型,
字段名3 类型
);
变量名 类型;
7.3.2 完成把id=3的数据放入一个结构变量
declare
type emptype is record(
id s_emp.id%type,
name s_emp.first_name%type,
salary s_emp.salary%type
);
var_emp emptype;
begin
select id,first_name,salary
into var_emp
from s_emp where id=3;
dbms_output.put_line(var_emp.id||
':'||var_emp.name||':'||
var_emp.salary);
end;
/
7.3.3 查询的字段数 少于记录类型字段数
declare
type emptype is record(
id s_emp.id%type,
name s_emp.first_name%type,
salary s_emp.salary%type
);
var_emp emptype;
begin
select first_name,salary
into var_emp.name,var_emp.salary
from s_emp where id=3;
dbms_output.put_line(var_emp.id||
':'||var_emp.name||':'||
var_emp.salary);
end;
/
7.3.4 记录类型变量之间的赋值
declare
type emptype is record(
id s_emp.id%type,
name s_emp.first_name%type,
salary s_emp.salary%type
);
var_emp emptype;
var_emp2 emptype;
begin
select id,first_name,salary
into var_emp2
from s_emp where id=3;
-- var_emp:=var_emp2;
var_emp.salary:=var_emp2.salary;
var_emp.name:=var_emp2.name;
dbms_output.put_line(var_emp.id||
':'||var_emp.name||':'||
var_emp.salary);
end;
/
7.4 思考如何把id=1的所有的数据放入一个
记录类型对应的变量中。然后输出这个变量
对应的id first_name salary。
可以使用 表名%rowtype 获取表的一行对应
的类型。得到实际上是一个字段名 和 字段
顺序完全和表头相同的记录类型。
declare
var_emp s_emp%rowtype;
begin
select * into var_emp
from s_emp where id=1;
dbms_output.put_line(var_emp.id||
':'||var_emp.first_name||':'||
var_emp.salary);
end;
/
7.5 类似于c中数组类型的类型
table类型
7.5.1 table类型的语法
type 类型名 is table of
表中元素类型
index by binary_integer;
7.5.2 举例
把 300 500 900 1100 这些数据
放入一个数组变量中。取得其中的
一个值。
declare
type numstype is table of
number index by binary_integer;
var_nums numstype;
begin
var_nums(-1):=300;
var_nums(0):=500;
var_nums(1):=900;
var_nums(2):=1100;
dbms_output.put_line
(var_nums(1));
end;
/
7.5.3 下标连续时对table变量进行遍历
declare
type numstype is table of
number index by binary_integer;
var_nums numstype;
var_ind binary_integer;
begin
var_nums(-1):=300;
var_nums(0):=500;
var_nums(1):=900;
var_nums(2):=1100;
var_ind:=-1;
dbms_output.put_line
(var_nums(var_ind));
var_ind:=var_ind+1;
dbms_output.put_line
(var_nums(var_ind));
var_ind:=var_ind+1;
dbms_output.put_line
(var_nums(var_ind));
var_ind:=var_ind+1;
dbms_output.put_line
(var_nums(var_ind));
end;
/
7.5.4 下标不连续时对table变量进行遍历
迭代器思想:可以根据一个元素的信息
获取到下一个元素的信息。
first() 获取第一个元素对应的下标
next(n) 可以根据一个元素下标n 获得
下一个元素对应的下标。
last() 获取最后一个元素对应的下标
declare
type numstype is table of
number index by binary_integer;
var_nums numstype;
var_ind binary_integer;
begin
var_nums(-1):=300;
var_nums(-2):=500;
var_nums(1):=900;
var_nums(3):=1100;
var_ind:=var_nums.first();
dbms_output.put_line
(var_nums(var_ind));
var_ind:=var_nums.next(var_ind);
dbms_output.put_line
(var_nums(var_ind));
var_ind:=var_nums.next(var_ind);
dbms_output.put_line
(var_nums(var_ind));
var_ind:=var_nums.next(var_ind);
dbms_output.put_line
(var_nums(var_ind));
var_ind:=var_nums.last();
dbms_output.put_line
(var_nums(var_ind));
end;
/
八.变量的作用域和可见性
<<abc>>
declare
var_x number:=1;
begin
declare
var_x number:=100;
begin
/* 局部可以访问全局和局部 */
dbms_output.put_line(var_x);
dbms_output.put_line(abc.var_x);
end;
/* 全局不能访问局部 */
end;
/
九.控制语句
9.1 分支语句
9.1.1 分支语句语法
if(a>b){ if a>b then
} end if;
--------------------------------
if(a>b){ if a>b then
}else{ else
} end if;
if(a>b){ if a>b then
}else if(a>c){ elsif a>c then
}else if(a>d){ elsif a>d then
} end if;
if(a>b){ if a>b then
}else if(a>c){ elsif a>c then
}else if(a>d){ elsif a>d then
}else{ else
} end if;
9.1.2 分支语句练习
定义三个整数变量 分别赋值 使用分支语句
选择出这三个变量中的最大值。
declare
var_x number:=100;
var_y number:=300;
var_z number:=800;
begin
var_z:=&var_z;
if var_x < var_y then
if var_y < var_z then
dbms_output.put_line(var_z);
else
dbms_output.put_line(var_y);
end if;
else
if var_x < var_z then
dbms_output.put_line(var_z);
else
dbms_output.put_line(var_x);
end if;
end if;
end;
/
declare
var_x number:=100;
var_y number:=300;
var_z number:=800;
var_max number;
begin
var_z:=&var_z;
var_max:=var_x;
if var_max < var_y then
var_max:=var_y;
end if;
if var_max < var_z then
var_max:=var_z;
end if;
dbms_output.put_line(var_max);
end;
/
9.1.3 分支语句练习
验证一下NULL值的特性
declare
var_x number;
var_y number;
begin
if var_x < var_y then
dbms_output.put_line('var_x<var_y');
elsif var_x > var_y then
dbms_output.put_line('var_x>var_y');
elsif var_x is null and
var_y is null then
dbms_output.put_line('var_x is null and
var_y is null');
elsif var_x = var_y then
dbms_output.put_line('var_x=var_y');
end if;
end;
/
9.2 循环语句
9.2.1 简单循环
loop
/* 要循环执行的代码 */
end loop;
declare
var_x number:=1;
begin
loop
dbms_output.put_line(var_x);
var_x:=var_x+1;
end loop;
end;
/
9.2.2 如何结束循环
exit when 结束条件;
if 结束条件 then
exit;
end if;
从1输出 10
declare
var_x number:=1;
begin
loop
dbms_output.put_line(var_x);
exit when var_x=10;
var_x:=var_x+1;
end loop;
end;
/
declare
var_x number:=1;
begin
loop
dbms_output.put_line(var_x);
if var_x=10 then
dbms_output.put_line
('end loop');
exit;
end if;
var_x:=var_x+1;
end loop;
end;
/
9.2.3 while 循环
PLSQL 过程化sql (procedure)
proc/c++ 使用c或者c++ 访问oracle数据库
ODBC/ADO vc中访问数据库的技术
SQLJ/JDBC java 访问oracle的技术
OCI oracle底层连接接口
二.plsql的特点
结构化 模块化编程
良好的可维护性
良好的可移植性 9i 10g 11g
提升系统的性能
不编译向异构数据库移植
(sqlserver mysql 存储过程)
三.plsql 扩展了 sql
变量和类型
控制结构 if for goto
过程和 函数
对象和 方法
四.plsql 的程序结构
declare
/* 声明区 申明区
声明变量 定义类型 */
begin
/* 执行区
执行sql语句 或者 plsql语句 */
exception
/* 异常处理区
当程序出错时 自动转入异常处理区*/
end;
/
五.第一个plsql程序
begin
dbms_output.put_line('hello plsql!');
end;
/
set serveroutput on;
开发工具:
sqlplus
sqlprogrammer
plsqldeveloper
六.变量
6.1 标识符
给变量 类型 函数 过程 等命名的。
6.2 变量
declare
变量名 类型;
begin
declare
var_x number;
begin
如果一个变量没有赋值 则这个变量的
值一定是NULL值。
6.3 如何给变量赋值
初始化和赋值 都使用 :=
declare
var_x number;
begin
var_x:=100;
dbms_output.put_line('var_x='||
var_x);
end;
/
定义一个字符串类型的变量 长度是30
给这个变量赋值成 hello 最后打印
这个变量的值。
declare
var_name varchar2(30);
begin
var_name:='hello';
dbms_output.put_line('var_name='||
var_name);
end;
/
6.4 变量的修饰
变量名 constant 类型 not null:=值;
declare
var_name constant varchar2(30)
:='hello';
begin
-- var_name:='world';
dbms_output.put_line(var_name);
end;
/
declare
var_name varchar2(30) not null
:='abc';
begin
var_name:='test';
dbms_output.put_line(var_name);
end;
/
6.5 变量的类型
标量类型: char varchar2 number date
binary_integer boolean
组合类型: record table
参考类型: ref cursor
大类型:BLOB CLOB BFILE (了解)
(存储数据在服务器上的位置)
declare
var_ind binary_integer;
var_f boolean;
begin
var_ind:=10;
-- var_f:=true;
var_f:=false;
if var_f then
dbms_output.put_line(var_ind);
end if;
end;
/
七.plsql 扩展的类型的语法
7.1 定义两个变量 类型分别和s_emp
表中 first_name,salary的类型一致。
然后再把 id=1对应的两个字段的值
赋值给这两个变量 输出这两个变量的值。
declare
var_name varchar2(25);
var_sal number(11,2);
begin
var_name:='Carmen';
var_sal:=2500;
dbms_output.put_line(var_name||':'
||var_sal);
end;
/
7.2 表名.字段名%type 来直接获取字段
对应的类型。
declare
var_name s_emp.first_name%type;
var_sal s_emp.salary%type;
begin
select first_name,salary
into var_name,var_sal
from s_emp where id=2;
dbms_output.put_line(var_name||':'
||var_sal);
end;
/
7.3 把id=3的 id first_name salary
对应的值查询出来。放入一个类似于c
语言结构体类型的变量。(record )
7.3.1 record类型语法:
type 类型名 is record(
字段名1 类型,
字段名2 类型,
字段名3 类型
);
变量名 类型;
7.3.2 完成把id=3的数据放入一个结构变量
declare
type emptype is record(
id s_emp.id%type,
name s_emp.first_name%type,
salary s_emp.salary%type
);
var_emp emptype;
begin
select id,first_name,salary
into var_emp
from s_emp where id=3;
dbms_output.put_line(var_emp.id||
':'||var_emp.name||':'||
var_emp.salary);
end;
/
7.3.3 查询的字段数 少于记录类型字段数
declare
type emptype is record(
id s_emp.id%type,
name s_emp.first_name%type,
salary s_emp.salary%type
);
var_emp emptype;
begin
select first_name,salary
into var_emp.name,var_emp.salary
from s_emp where id=3;
dbms_output.put_line(var_emp.id||
':'||var_emp.name||':'||
var_emp.salary);
end;
/
7.3.4 记录类型变量之间的赋值
declare
type emptype is record(
id s_emp.id%type,
name s_emp.first_name%type,
salary s_emp.salary%type
);
var_emp emptype;
var_emp2 emptype;
begin
select id,first_name,salary
into var_emp2
from s_emp where id=3;
-- var_emp:=var_emp2;
var_emp.salary:=var_emp2.salary;
var_emp.name:=var_emp2.name;
dbms_output.put_line(var_emp.id||
':'||var_emp.name||':'||
var_emp.salary);
end;
/
7.4 思考如何把id=1的所有的数据放入一个
记录类型对应的变量中。然后输出这个变量
对应的id first_name salary。
可以使用 表名%rowtype 获取表的一行对应
的类型。得到实际上是一个字段名 和 字段
顺序完全和表头相同的记录类型。
declare
var_emp s_emp%rowtype;
begin
select * into var_emp
from s_emp where id=1;
dbms_output.put_line(var_emp.id||
':'||var_emp.first_name||':'||
var_emp.salary);
end;
/
7.5 类似于c中数组类型的类型
table类型
7.5.1 table类型的语法
type 类型名 is table of
表中元素类型
index by binary_integer;
7.5.2 举例
把 300 500 900 1100 这些数据
放入一个数组变量中。取得其中的
一个值。
declare
type numstype is table of
number index by binary_integer;
var_nums numstype;
begin
var_nums(-1):=300;
var_nums(0):=500;
var_nums(1):=900;
var_nums(2):=1100;
dbms_output.put_line
(var_nums(1));
end;
/
7.5.3 下标连续时对table变量进行遍历
declare
type numstype is table of
number index by binary_integer;
var_nums numstype;
var_ind binary_integer;
begin
var_nums(-1):=300;
var_nums(0):=500;
var_nums(1):=900;
var_nums(2):=1100;
var_ind:=-1;
dbms_output.put_line
(var_nums(var_ind));
var_ind:=var_ind+1;
dbms_output.put_line
(var_nums(var_ind));
var_ind:=var_ind+1;
dbms_output.put_line
(var_nums(var_ind));
var_ind:=var_ind+1;
dbms_output.put_line
(var_nums(var_ind));
end;
/
7.5.4 下标不连续时对table变量进行遍历
迭代器思想:可以根据一个元素的信息
获取到下一个元素的信息。
first() 获取第一个元素对应的下标
next(n) 可以根据一个元素下标n 获得
下一个元素对应的下标。
last() 获取最后一个元素对应的下标
declare
type numstype is table of
number index by binary_integer;
var_nums numstype;
var_ind binary_integer;
begin
var_nums(-1):=300;
var_nums(-2):=500;
var_nums(1):=900;
var_nums(3):=1100;
var_ind:=var_nums.first();
dbms_output.put_line
(var_nums(var_ind));
var_ind:=var_nums.next(var_ind);
dbms_output.put_line
(var_nums(var_ind));
var_ind:=var_nums.next(var_ind);
dbms_output.put_line
(var_nums(var_ind));
var_ind:=var_nums.next(var_ind);
dbms_output.put_line
(var_nums(var_ind));
var_ind:=var_nums.last();
dbms_output.put_line
(var_nums(var_ind));
end;
/
八.变量的作用域和可见性
<<abc>>
declare
var_x number:=1;
begin
declare
var_x number:=100;
begin
/* 局部可以访问全局和局部 */
dbms_output.put_line(var_x);
dbms_output.put_line(abc.var_x);
end;
/* 全局不能访问局部 */
end;
/
九.控制语句
9.1 分支语句
9.1.1 分支语句语法
if(a>b){ if a>b then
} end if;
--------------------------------
if(a>b){ if a>b then
}else{ else
} end if;
if(a>b){ if a>b then
}else if(a>c){ elsif a>c then
}else if(a>d){ elsif a>d then
} end if;
if(a>b){ if a>b then
}else if(a>c){ elsif a>c then
}else if(a>d){ elsif a>d then
}else{ else
} end if;
9.1.2 分支语句练习
定义三个整数变量 分别赋值 使用分支语句
选择出这三个变量中的最大值。
declare
var_x number:=100;
var_y number:=300;
var_z number:=800;
begin
var_z:=&var_z;
if var_x < var_y then
if var_y < var_z then
dbms_output.put_line(var_z);
else
dbms_output.put_line(var_y);
end if;
else
if var_x < var_z then
dbms_output.put_line(var_z);
else
dbms_output.put_line(var_x);
end if;
end if;
end;
/
declare
var_x number:=100;
var_y number:=300;
var_z number:=800;
var_max number;
begin
var_z:=&var_z;
var_max:=var_x;
if var_max < var_y then
var_max:=var_y;
end if;
if var_max < var_z then
var_max:=var_z;
end if;
dbms_output.put_line(var_max);
end;
/
9.1.3 分支语句练习
验证一下NULL值的特性
declare
var_x number;
var_y number;
begin
if var_x < var_y then
dbms_output.put_line('var_x<var_y');
elsif var_x > var_y then
dbms_output.put_line('var_x>var_y');
elsif var_x is null and
var_y is null then
dbms_output.put_line('var_x is null and
var_y is null');
elsif var_x = var_y then
dbms_output.put_line('var_x=var_y');
end if;
end;
/
9.2 循环语句
9.2.1 简单循环
loop
/* 要循环执行的代码 */
end loop;
declare
var_x number:=1;
begin
loop
dbms_output.put_line(var_x);
var_x:=var_x+1;
end loop;
end;
/
9.2.2 如何结束循环
exit when 结束条件;
if 结束条件 then
exit;
end if;
从1输出 10
declare
var_x number:=1;
begin
loop
dbms_output.put_line(var_x);
exit when var_x=10;
var_x:=var_x+1;
end loop;
end;
/
declare
var_x number:=1;
begin
loop
dbms_output.put_line(var_x);
if var_x=10 then
dbms_output.put_line
('end loop');
exit;
end if;
var_x:=var_x+1;
end loop;
end;
/
9.2.3 while 循环