常见访问oracle的技术
PLSQL 过程化sql procedure(存储过程)
proc/c++ 使用c和c++访问oracle数据库
odbc/ado vc访问数据库的技术
sqlj/jdbc java 访问数据库的技术
一plsql中的变量
1.变量的定义 和 初始化
2.变量的修饰
constant not null
一个变量声明为not null 必须赋初始值 ,因为
任何一个变量 定义之后不赋值 值都是NULL.
3.变量的类型
标量类型
数字类型 number binary_integer
字符类型 char varchar2
布尔类型 boolean (true false NULL)
日期类型 date
组合类型
record table
参考类型 引用类型
ref cursor
大类型
CLOB
BLOB 0-4g
BFILE (一般不使用这种类型 因为存储数据
的路径就可以解决问题)
4.使用%type 得到表的字段对应的类型
表名.字段名%type
5.记录类型 record 类型
/*定义一个类似于c语言结构体的类型 */
type 类型名 is record(
字段名 类型,
字段名 类型,
字段名 类型
);
把s_emp 表中的id first_name salary
对应的类型取出来定义变量
然后把id=1的数据赋值给 记录变量
输出这些信息
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
/* 使用sql 给记录类型的变量赋值 */
select id,first_name,salary into var_emp
from s_emp where id=1;
dbms_output.put_line(var_emp.id||':'||
var_emp.name||':'||var_emp.salary);
end;
-------------------------
/*当查询的字段数 少于记录类型的字段数?
没有赋值的字段是NULL值*/
----------------------------------------------
特殊的记录类型
表名%rowtype 取得表的一行对应的类型
s_emp%rowtype
和字段顺序完全相同的记录类型。
6. 类似于c数组的类型 table类型
/*下标不连续
迭代器思想
first() 得到第一个元素对应的下标
last() 最后一个元素对应的下标
next(n) 根据一个元素的下标得到下一个元素的
下标*/
7 变量的作用域和 可见性(跟c语言完全一样)
二. 控制语句
1)分支语句
if a>b then
end if;
------------------
if a>b then
else
end if;
--------------------
if a<b then
elsif a<c then
elsif a<d then
end if;
--------------
2).循环语句
a.简单循环
1.语法
loop
/*循环代码*/
end loop;
一个例子
exit when 退出条件;
if 退出条件 then
exit;
end if;
------------------------
b.while 循环
.while 循环的语法
--------------------
c.for 循环 ----智能循环
1.for循环语法
for 变量 in a..b loop
end loop;
2.输出1到10
begin
for var_i in 1..10 loop
dbms_output.put_line(var_i);
end loop;
end;
3.for循环中的变量不允许修改
4.如何反向输出 输出10 到 1
begin
for var_i in reverse 1..10 loop
dbms_output.put_line(var_i);
exit when var_i=5;
end loop;
end;
----------------------------
d.循环的嵌套 --如何退出循环
1.使用类似c语言的goto 语句
2.plsql中可以把标签放前面
PLSQL 过程化sql procedure(存储过程)
proc/c++ 使用c和c++访问oracle数据库
odbc/ado vc访问数据库的技术
sqlj/jdbc java 访问数据库的技术
plsql 扩展了sql
1.变量 和数据类型
2.控制语句 if for goto
3.过程和 函数
4.对象和对象的函数
plsql的程序结构
declare
/*申明区
定义变量 和 定义类型 */
begin
/*执行区
执行sql语句 和plsql语句*/
exception
/*异常处理区
处理错误的区域*/
end;
设置输出并测试
set serveroutput on
/*测试*/
begin
dbms_output.put_line('hello plsql');
end;
/
一plsql中的变量
1.变量的定义 和 初始化
declare
var_id number:=100;
var_name varchar2(30):='test';
begin
dbms_output.put_line(var_id||':'||
var_name);
end;
/
2.变量的修饰
constant not null
declare
/* 定义变量 */
var_id constant number:=1000;
var_name varchar2(30) not null:='a';
begin
/* 赋值*/
var_id:=1001; */
var_name:='test';
dbms_output.put_line(var_id||':'||
var_name);
end;
/
一个变量声明为not null 必须赋初始值 ,因为
任何一个变量 定义之后不赋值 值都是NULL.
3.变量的类型
标量类型
数字类型 number binary_integer
字符类型 char varchar2
布尔类型 boolean (true false NULL)
日期类型 date
组合类型
record table
参考类型 引用类型
ref cursor
大类型
CLOB
BLOB 0-4g
BFILE (一般不使用这种类型 因为存储数据
的路径就可以解决问题)
4.使用%type 得到表的字段对应的类型
表名.字段名%type
declare
var_id s_emp.id%type;
var_name s_emp.first_name%type;
begin
/* 使用sql语句给变量赋值 */
select id,first_name into var_id,var_name
from s_emp where id=1;
dbms_output.put_line(var_id||':'
||var_name);
end;
5.记录类型 record 类型
/*定义一个类似于c语言结构体的类型 */
type 类型名 is record(
字段名 类型,
字段名 类型,
字段名 类型
);
把s_emp 表中的id first_name salary
对应的类型取出来定义变量
然后把id=1的数据赋值给 记录变量
输出这些信息
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
/* 使用sql 给记录类型的变量赋值 */
select id,first_name,salary into var_emp
from s_emp where id=1;
dbms_output.put_line(var_emp.id||':'||
var_emp.name||':'||var_emp.salary);
end;
-------------------------
/*当查询的字段数 少于记录类型的字段数?
没有赋值的字段是NULL值*/
----------------------------------------------
特殊的记录类型
表名%rowtype 取得表的一行对应的类型
s_emp%rowtype
declare
/*使用表的一行的类型定义一个变量*/
var_emp s_emp%rowtype;
var_emp2 s_emp%rowtype;
begin
select * into var_emp2 from s_emp where id=1;
var_emp:=var_emp2;
dbms_output.put_line(var_emp.id||':'||
var_emp.first_name||':'||var_emp.salary);
end;
%rowtype 就是一个字段名和表头中的字段名
和字段顺序完全相同的记录类型。
6. 类似于c数组的类型 table类型
declare
/*定义一个table类型*/
type numstype is table of s_emp.id%type
index by binary_integer;
var_nums numstype;
var_ind binary_integer:=1;
begin
var_nums(1):=100;
var_nums(2):=300;
var_nums(3):=800;
select salary into var_nums(4) from s_emp
where id=1;
/*访问table类型的变量*/
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;
/*下标不连续
迭代器思想
first() 得到第一个元素对应的下标
last() 最后一个元素对应的下标
next(n) 根据一个元素的下标得到下一个元素的
下标*/
declare
/*定义一个table类型*/
type numstype is table of s_emp.id%type
index by binary_integer;
var_nums numstype;
var_ind binary_integer:=1;
begin
var_nums(1):=100;
var_nums(5):=300;
var_nums(3):=800;
select salary into var_nums(4) from s_emp
where id=1;
/*访问table类型的变量*/
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.last();
dbms_output.put_line(var_nums(var_ind));
end;
7 变量的作用域和 可见性(跟c语言完全一样)
二. 控制语句
1)分支语句
if a>b then
end if;
------------------
if a>b then
else
end if;
--------------------
if a<b then
elsif a<c then
elsif a<d then
end if;
--------------
2).循环语句
a.简单循环
1.语法
loop
/*循环代码*/
end loop;
一个例子
/*从1 输出到 10*/
declare
var_i number;
begin
var_i:=1;
loop
dbms_output.put_line(var_i);
/*退出循环*/
exit when var_i=10;
var_i:=var_i+1;
end loop;
end;
/*如何退出循环?*/
exit when 退出条件;
if 退出条件 then
exit;
end if;
------------------------
b.while 循环
.while 循环的语法
while 循环条件 loop
end loop;--------------------
c.for 循环 ----智能循环
1.for循环语法
for 变量 in a..b loop
end loop;
2.输出1到10
begin
for var_i in 1..10 loop
dbms_output.put_line(var_i);
end loop;
end;
3.for循环中的变量不允许修改
4.如何反向输出 输出10 到 1
begin
for var_i in reverse 1..10 loop
dbms_output.put_line(var_i);
exit when var_i=5;
end loop;
end;
----------------------------
d.循环的嵌套 --如何退出循环
1.使用类似c语言的goto 语句
declare
var_x number:=1;
var_y number:=1;
begin
loop
var_y:=1;
loop
dbms_output.put_line(var_y);
/*满足一个条件 退出外层循环*/
if var_y=3 then
goto outerloop;
end if;
var_y:=var_y+1;
end loop;
exit when var_x=3;
var_x:=var_x+1;
end loop;
<<outerloop>>
NULL;
end;
2.plsql中可以把标签放前面
declare
var_x number:=1;
var_y number:=1;
begin
<<outerloop>>
loop
var_y:=1;
loop
dbms_output.put_line(var_y);
/*满足一个条件 退出外层循环*/
if var_y=3 then
exit outerloop;
end if;
var_y:=var_y+1;
end loop;
exit when var_x=3;
var_x:=var_x+1;
end loop;
end;