/*
达内学习 Oracle day41 2013-10-30
*/
常见的访问oracle的技术
1.prosql 过程化SQL
2.proc/c++ 使用C语言或者C++反问Oracle数据库
3.odbc /ADO VC中访问数据库的技术
4.JDBC/SQLJ JAVA访问数据库技术
5.OCI oracle底层连接接口
PL/SQL(procedural language/Sql)是在标准SQL的基础上增加了过程化处理的语言
oracle客户端工具访问oracle的操作语言
oracle对sql的扩充
plsql扩展了sql
变量和数据类型、控制语句(if 、for、go)、过程(procedure)和函数(function)、对象和方法 。
plsql的程序结构:
declare
/*申明区:*/
begin
/*执行区*/
exception
/*异常处理区*/
end;
--------------------------------
c语言的定义和申明
int a;//定义
extern int a;//申明 外部变量
--------------------------------
申明区:用来定义变量 或者 类型。 (不区分定义和申明)
执行区:用来执行sql语句或者plsql语句
异常处理区:当sql语句出错以后 自动转到异常处理区 做错误处理
图形界面:sqldeveloper
begin
dbms_output.put_line('hello plsql!');
end;
打开输出:
set serveroutput on
------------------------------------------
变量的定义:
1,一定要在申明区
变量名 类型;
2,举例
declare
var_id number:=111;
var_name varchar2(30):='wocao';
begin
dbms_output.put_line(var_id||':'||var_name);
var_id := 1234;
var_name := 'wozaicao';
dbms_output.put_line(var_id||'@'||var_name);
end;
3,变量的修饰
变量名 constant 类型;
变量名 类型 not null;
var_id constant number:=111; --不允许修改
var_name varchar2(30) not null:='wocao'; --必须初始化
4,变量的数据类型
标量类型:
number(数字)、binary_integer(二进制整数)、char(定长字符串)
varchar2(变长字符串)、date(日期类型)、boolean(布尔类型 true false null)
复合类型:
record(记录 对应结构)
table (表类型)
参考类型
ref 参考类型
ref cursor 参考游标
大类型:
blob 大二进制 0-4g
clog 大字符类型 0-4g
bfile 文件类型 0-4g
declare
flag boolean := true;
jobno binary_integer :=123;
begin
if flag then
dbms_output.put_line(jobno);
end if;
end;
-------------------------------------------------
5,取得表中字段对应的类型
表名.字段名%type 取得对应的类型
定义两个变量 分别和s_emp 表中的 id 和first_name 的类型相同 然后把id = 1的first_name 赋值给定义的变量
declare
myid s_emp.id%type :=1; /*通过%type定义类型*/
myname s_emp.first_name%type;
begin /*通过select into语句赋值*/
select first_name into myname from s_emp where id = myid;
dbms_output.put_line(myid||' '||myname);
end;
declare
myid s_emp.id%type := 3;
myname s_emp.first_name%type;
mysalary s_emp.salary%type ;
begin
select id,first_name,salary into myid,myname,mysalary from s_emp where id = 3;
dbms_output.put_line(myid||myname||mysalary);
end;
6,类似于C语言结构体的类型
record 类型
定义record类型
type record_name is record (
字段名 类型,
字段名 类型
);
变量名 记录类型的名字;
declare
type myrecord is record(/*定义记录*/
myid s_emp.id%type,
myname s_emp.first_name%type,
mysalary s_emp.salary%type
);
my3 myrecord; /*定义记录变量*/
my2 myrecord;
begin
select id,first_name,salary into my3 from s_emp where id = 3;
dbms_output.put_line(my3.myid||' '||my3.myname||' '||my3.mysalary);
/*记录类型之间的赋值*/
my2:= my3;/*字符串赋值 my2.name = my3.name */
end;
----------------------------------
把s_emp 表中id =1的所有数据记录在变量中
s_emp%rowtype
s_dept%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;
/*把id= 50的部门信息仿如一个rowtype类型的变量中并输出*/
declare
type var_dept s_dept%rowtype;
begin
select * into var_dept from s_dept where id = 50 ;
dbms_output.put_line(var_dept.id||var_dept.name||var_dept.region_id);
end;
--------------------------------------------------------------------------
8,table 类型
相当于c中的数组类型
定义 table 类型
type table_name is table of 表中的数据类型 index by binary_integer;
declare
/*定义表类型*/
type numstype is table of number index by binary_integer;
/*使用类型定义变量*/
var_nums numstype;
/*定义一个下标变量*/
var_ind binary_integer;
begin
--向table类型变量中放入数据
var_nums(-1):= 234;
var_nums(1):= 23;
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));
end;
/*迭代器思想 根据一个元素的信息 可以得到下一个元素的信息*/
first()可以返回第一个元素对于的下标
next(n) 根据一个元素的下标得到下一个元素的下标
last()得到最后一个元素对应的下标
把s_emp表中idd=1 或 id= 5 或 id= 11 的所有数据放入一个table类型的变量中,然后用迭代器打印 id first_name salary
---- 老师写的
declare
type empstype is table of s_emp%rowtype index by binary_integer;
var_emps empstype;
var_ind binary_integer:=1;
begin
select * into var_emps(var_ind) from s_emp where id=var_ind;
var_ind:=5;
select * into var_emps(var_ind) from s_emp where id=var_ind;
var_ind:=11;
select * into var_emps(var_ind) from s_emp where id=var_ind;
var_ind:=var_emps.first();
dbms_output.put_line(var_emps(var_ind).id||':'||var_emps(var_ind).salary);
var_ind:=var_emps.next(var_ind);
dbms_output.put_line(var_emps(var_ind).id||':'||var_emps(var_ind).salary);
var_ind:=var_emps.last();
dbms_output.put_line(var_emps(var_ind).id||':'||var_emps(var_ind).salary);
end;
----
------------------------------------------------------------
变量的作用域 和 可见行
plsql块 嵌套
<<abc>> --标签
declare
var_m number:= 1;
begin
declare
var_n number:=100;
begin
/*
局部 可以访问全局 局部优先
*/
end;
/* 全局不能访问局部*/
end;
---------------------------------------------------------
plsql中的控制语句
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;
if a<b then
elsif a<c then
elsif a<d then
else
end if;
----------------------------------------------------------
循环
a,简单循环
loop
……循环条件
end loop;
终止循环:exit when 条件;
if 条件 then exit;
b,while 循环
while 循环条件 loop
……循环语句
end loop;
declare
i number :=1;
begin
while i<11 loop
dbms_output.put_line(i);
i:=i+1;
end loop;
end;
c,for 循环 ------智能循环
for 变量 in 区间 loop
/* 循环语句 */
end loop;
整数区间1..10 1到10
begin
for i in 1..10 loop
dbms_output.put_line(i);
end loop;
end;
begin
for i in reverse 1..10 loop
dbms_output.put_line(i);
exit when i=5;
end loop;
end;
for循环中的变量不能被修改
-----------------------------------------------------
多重循环的退出
declar
var_m number;
var_n number;
begin
while var_m < 4 loop
end loop;
end;
有一个人他有一个小狗,有一天他突然想养一只小猫,小狗就是不同意,但是他就是非要想养一只小猫,小狗就是不同意,那肿么办呢?于是他就和小狗商量说,咱家再养一只小狗好不好,小狗非常开心,因为他每天那么寂寞其实早就想有一个小伙伴了,晚上的时候小狗很高兴很高兴,一晚上都没有睡觉,第二天早晨的时候,主人告诉小狗说咱家要不不养小狗了好吗?小狗当然很失望,很生气,很不愿意,主人趁机说,养小狗可以那养小猫为什么不可以啊,要不这样吧,养一只小狗也养一只小猫好不好,小狗太孤独了只好答应了,虽然它不想多一只小猫,可是最起码也多了一只小狗啊。后来公主和王子过上了幸福的生活。