pl/sql是一种访问数据库的编程语言,专门访问oracle数据库,只能用于oracle。
begin开始 end结束
程序演示
declare
v_num number;
v_str varchar2(20);
begin
v_num:=2+3;
dbms_output.put_line('v_num='||v_num);
v_str:='tom''s pen';
dbms_output.put_line(v_str);
end;
dbms_output.put_line();里面只能写一个内容 写多个要加上||
要先打开输出结果显示 set serveroutput on;
@文件名
@test.sql 这个是进入sqlplus的目录下的文件
加上目录
@目录/test.sql
/
----------------------------------------------------------
数字类型
number
number子类型
binary_integer
最主要的 是number 和binart_integer 两种类型
number(3) 精度为3 有效数字为三位 ex:123
number(3)如果赋值1234 编译的时候就会报错的
number(4,3) 4为精度 3为刻度 ex:1.234 整数部分最多也就只有一位了
number(4,3) 1.23456 有效的是 1.235 四舍五入
number(3,-3) 小数点前面3为四舍五入
p+|s|>=有效数位 ex:1234 结果就是1000 因为从2开始四舍五入
number(4,6) ex:0.0012345 也是没有错误的 结果是 0.001235
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*--*-*-*-*-*-
有效数位是指从左边算起第一个不为0的数字开始算起
*-*--*-*-*-*-*-*-*-*-*-*--*-*-**-*-*-*--*-*-**-*-*-*--**-*-*-*--*-*-**-*--**--**
binary_integer 只能保存整数
number底层不是用二进制来保存的
如果变量数据日后一定和表里的数据进行计算 那么这样的情况下一般会用
number 如果保存的只是来进行计算 不能 跟表里的数据有什么交互 我们就使用binary_integer
字符类型
varchar2 等价 varchar 等价sting.......
long 和varchar2差不多 保存的字节数 没有varchar2多 跟数据库里的long是不同的
布尔类型
boolean 布尔类型
日期类型
date
timestamp
查表里的数值 并且赋值给变量
declare
v_id bob.id%type;
v_name bob.name%type;
v_salary bob.salary%type;
begin
SELECT id,name,salary
INTO v_id,v_name,v_salary
FROM bob
WHERE id=1;
/*现在查询的结果只有一个,但是如果结果有两个值的话 用into会报错,定义
变量的属性参考数据库表的属性如果表里的字段属性发生变化,那么sql脚本
里面也要做出相应的更改*/
dbms_output.put_line(v_id||''||v_name||''||v_salary);
end;
record 把多个变量集中在一种类型 进行一种封装
..............................................................................................
declare
/*
v_id bob.id%type;
v_name bob.name%type;
v_salary bob.salary%type;
*/
TYPE t_bob IS RECORD(
id bob.id%type,
name bob.name%type,
salary bob.salary%type
);
v_bob t_bob;
/* record 定义的顺序和 查询的顺序要一样*/
begin
SELECT id,name,salary
INTO v_bob
FROM bob
WHERE id=2;
dbms_output.put_line(v_bob.id||''||v_bob.name||''||v_bob.salary);
end;
.............................................................................................
declare
TYPE t_bob IS RECORD(
id bob.id%type,
name bob.name%type,
salary bob.salary%type
);
v_bob t_bob;
v_bob2 t_bob;
begin
SELECT id,name,salary
INTO v_bob
FROM bob
WHERE id=2;
/*
v_bob2.id:=v_bob.id;
v_bob2.name:=v_bob.name;
v_bob2.salary:=v_bob.salary;
*/
v_bob2:=v_bob;
--在类型一样的时候 可以这样赋值
dbms_output.put_line(v_bob.id||''||v_bob.name||''||v_bob.salary);
end;
............................................................................................
DECLARE
TYPE t_bob IS RECORD(
id bob.id%type,
name bob.name%type,
salary bob.salary%type
);
v_bob t_bob;
/* record 定义的顺序和 查询的顺序要一样*/
begin
SELECT *
--如果用星号 上面的record定义里面要跟表里免得顺序一样,全写出来
INTO v_bob
FROM bob
WHERE id=2;
dbms_output.put_line(v_bob.id||''||v_bob.name||''||v_bob.salary);
end;
*****************************************************************
%rowtype
语法bob%rowtype
DECLARE
v_bob bob%rowtype;
/* record 直接获取表里的所有字段属性*/
begin
SELECT *
--如果用星号 上面的record定义里面要跟表里面得顺序一样,全写出来
INTO v_bob
FROM bob
WHERE id=2;
dbms_output.put_line(v_bob.id||''||v_bob.name||''||v_bob.salary);
--输出的结果字段要和表里的字段一样了
end;
*****************************************************************
Table类型 是一个同种类型数据的集合
TYPE 类型名字 IS TABLE OF 任意一种已知的数据类型
INDEX BY BINARY_INTEGER;
DECLARE
TYPE t_bob IS TABLE OF bob%rowtype INDEX BY BINARY_INTEGER;
v_bob t_bob;
begin
select *
into v_bob(100)
from bob
where id=3;
select *
into v_bob(2000)
/*v_bob(2000)中的2000这个索引为任意数字 */
from bob
where id=4;
dbms_output.put_line(v_bob(100).id||''||v_bob(2000).name);
end;
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Exercise
create table bob(
id number(3),
name varchar(10),
salary number(5),
cid number(2)
);
insert into bob values(1,'weqb',2000,1);
insert into bob values(2,'dasdas',2100,2);
insert into bob values(3,'bob',2400,1);
insert into bob values(4,'dasda',4500,2);
insert into bob values(5,'bob',7850,1);
insert into bob values(6,'aswb',1235,2);
把这些数据都检索出来 RECORD table
DECLARE
/*
type v_bob is record(
id bob.id%type,
name bob.name%type,
salary bob.salary%type,
cid bob.cid%type
);
c_bob bob%rowtype;
*/
type v_bob is table of bob%rowtype index by binary_integer;
c_bob v_bob;
begin
select id,name,salary,cid
into c_bob(100)
from bob
where id=4;
dbms_output.put_line(c_bob(100).id||''||c_bob(100).name||''||c_bob(100).salary||''||c_bob(100).cid);
end;
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
变量的作用域就是说 哪里能用 哪里不能用 从变量声明开始到该语句块结束
DECLARE
V_num number := 100;
BEGIN
DECLARE
V_str number := 100;
V_num number := 10;
BEGIN
DBMS_OUTPUT.PUT_LINE(‘v_num=’||v_num);
DBMS_OUTPUT.PUT_LINE(‘v_str=’||v_str);
END;
--DBMS_OUTPUT.PUT_LINE(‘v_str=’||v_str);
END;
在最外面声明 不管里面有多少嵌套 都是可以使用的 而里面声明的变量外面就不可以使用的
在最外面加上标号 来访问
<
DECLARE
V_num number := 100;
BEGIN
DECLARE
V_str number := 100;
V_num number := 10;
BEGIN
DBMS_OUTPUT.PUT_LINE('v_num='|| outer.v_num);
DBMS_OUTPUT.PUT_LINE('v_str='|| v_str);
END;
--DBMS_OUTPUT.PUT_LINE('v_str='||v_str);
END;
******************************************************************
控制语句
If 语句
1. If 布尔表达式(true) THEN
……..
………
End if;
\2. If 布尔表达式(true) THEN
……..
else
………
End if;
3. If 布尔表达式(true) THEN
……..
elseif布尔表达式(true) THEN
.........
else
………
End if;
------------------------------------------------------------------------------------------------
exercis:
declare
v_flag boolean;
begin
if v_flag then
dbms_output.put_line('true');
elsif not v_flag then
dbms_output.put_line('false');
else
dbms_output.put_line('good');
end if;
end;
表bob id=3工资大于5000的 奖金给20% 2000-4500之间的是10% 小于2000的给5%
declare
c_bob bob.salary%type;
c_bouns bob.salary%type;
begin
select salary
into c_bob
from bob
where id=3;
if c_bob >5000 then
c_bouns:= c_bob *0.2;
elsif c_bob >2000 and c_bob <4500 then
c_bouns:= c_bob *0.1;
else
c_bouns:= c_bob *0.05;
end if;
dbms_output.put_line(' c_bouns ='|| c_bouns);
end;
******************************************************************
loop循环
loop
.......
if i>100 then
exit;
end if;
end loop;
或者是
exit when i>100 替代if 语句
1+2+3+...+100=a
declare
v_sum number :=0;
i number :=1;
begin
loop
v_sum :=v_sum+i;
i :=i+1;
exit when i>100;
end loop;
dbms_output.put_line('v_sum='||v_sum);
end;
while循环
where 布尔表达式 loop 如果是真 就继续循环 直到假的时候终止循环
..................循环体
end loop;
declare
a number :=1;
i number :=0;
begin
while i<=100 loop;
a:=a+i;
i:=i+1;
end loop;
end;
******************************************************************
1.从bob表里循环的找出5名员工信息 保存到一个table变量里面
2.循环的从变量里把这些员工信息出去来
declare
type v_bob is table of bob%rowtype index by binary_integer;
c_bob v_bob;
i number :=0;
begin
loop
select id,name,salary,cid
into c_bob(i+1)
from bob
where id=i+1;
i=i+1;
exit when i<=5;
end loop;
end;
如果给你带来帮助,欢迎微信或支付宝扫一扫,赞一下。