您的位置:首页 > 数据库

pl/sql基础语法

2012-09-07 09:59 447 查看
--数据定义

--创建表

--drop table scores;

--drop table student;

Create
table student(

Name varchar2(10)
constraint nname
not
null ,

No varchar2(3)
constraint pk_no
primary
key ,

Sex varchar2(4)default
'男'

);

create
table scores(

id number
constraint pk_ID
primary key ,

no varchar2(3)
constraint fp_no
references student(no) ,

name varchar2(100),

num number

);

--drop table scores;

--drop table student;

--创建视图

create
view view_student
as select
* from student;

drop
view view_student

---创建索引

create
index bh on student(no,name);

drop
index bh;

---创建约束条件

----ALTER TABLE 表名 ADD(CONSTRAINT 约束名 约束类型(列名))

alter
table STUDENT
add constraint chk
check (sex='男'
or sex=
'女');

----alter table 表名 drop(constraint)

alter
table student
drop constraint chk

ALTER
TABLE scores DISABLE
constraint pk_ID;----关闭 ALTER TABLE student DISABLE/enable CONSTRAINT nn_sname

ALTER
TABLE student disABLE
CONSTRAINT nname;

ALTER
TABLE scores DISABLE
constraint fp_no;

ALTER
TABLE student DISABLE
constraint nname;

ALTER
TABLE student DISABLE
constraint pk_no;

ALTER
TABLE student DISABLE
constraint nname;

---添加列 ALTER TABLE products ADD description text;

ALTER
TABLE student
ADD description
varchar2(100);

----删除列 ALTER TABLE products drop description text;

ALTER
TABLE student
drop column description ;

alter
table yw_cyzt_wyqytj
add YWFSR
number;

comment on
column yw_cyzt_wyqytj.ywfsr
is '物业费

收入';

alter
table yw_cyzt_wyqytj
add YWJYSR
number;

comment on
column yw_cyzt_wyqytj.YWJYSR
is '物业经

营收入';

alter
table yw_cyzt_wyqytj
add QTYWSR
number;

comment on
column yw_cyzt_wyqytj.QTYWSR
is '其他业

务收入';

数据查询

Select
* from student

数据库操纵

Update
insert delete

Update table_name

Insert
into table_name
values()

Delete table_name

添加数据

declare

icount integer;

sSQL varchar(100);

BEGIN

for icount
in 1 ..90 loop

sSQL:='insert into student(name,no)values('||icount
||','
|| icount
|| ');';

dbms_output.put_line(SSQL);

---execute immediate sSQL;

END LOOP;

END;

Sql块

DECLARE

V1 nchar(10);

v_no varchar(3):='1';

BEGIN

SELECT t.name
INTO V1
FROM student t
WHERE no=v_no;

--SELECT t.name INTO V1 FROM student t

DBMS_OUTPUT.PUT_LINE (v1);

exception

When TOO_MANY_ROWS
THEN

DBMS_OUTPUT.PUT_LINE ('More than one manager');

end;

自定义变量

Record类型

declare

type t_re is record

( name1 student.name%type,name2 student.no%type,name3 student.sex%type);

re t_re;

begin

select
* into re
from student
where no=40;

--select * into re from student where no=40;

dbms_output.put_line(re.name1 ||
';'
|| re.name2
|| ';'
||re.name3);

exception

when too_many_rows
then

DBMS_OUTPUT.PUT_LINE ('More than one manager');

end;

索引表

-- INDEX BY TABLES(不是非/聚簇索引-存在的物理表,它是一个虚拟表)

declare

cursor cur
is select
* from student;

type type_arr is
table
of student%rowtype
index
by binary_integer;

arr_tr type_arr;

iCount integer:=1;

begin

for i
in cur LOOP

arr_tr(icount):=i;

icount:=icount+1;

END LOOP;

for icount
in 1 ..arr_tr.count loop

dbms_output.put_line(arr_tr(icount).name || arr_tr(icount).no
|| arr_tr(icount).sex );

end loop;

if arr_tr.EXISTS(2)
then

dbms_output.put_line('arr_tr(2)='
|| arr_tr(2).name
|| arr_tr(2).no
|| arr_tr(2).sex);

end
if;

end;

游标变量

显示游标

declare

icount integer:=0;

cursor cur1
is select
* from student ;---不带参数的游标

cursor cur2(v_no
number)
is select
* from student t
where to_number(t.no)>v_no;---带参数游标

type type_record is record (name student.name%type,no student.no%type,sex
student.sex%type);

rec_stu type_record;

v_name student.name%type;

v_no student.no%type;

v_sex student.sex%type;

begin

dbms_output.put_line('不带参数的手动打开的游标' );

open cur1;--

loop

exit
when cur1%notfound;

fetch cur1
into rec_stu;

dbms_output.put_line('当前获取的值为:'
|| rec_stu.name
||rec_stu.no||rec_stu.sex);

end loop;

close cur1;

dbms_output.put_line('带参数的用for打开的游标');

for i
in cur2(20)loop

dbms_output.put_line('当前获取的值为:'
|| i.name
||i.no||i.sex);

end loop;

end;

隐示游标

declare

v_no varchar2(10):=&学号;

--v_no number:=&学号;---为什么在数字时能够正确判断

begin

delete scores t
where t.no=trim(v_no);

--delete scores t where t.no=v_no;

if sql%notfound
then---found,rowcount,isopen

delete student t1
where t1.no=v_no;

dbms_output.put_line(sql%rowcount);

end
if;

end;

游标修改 删除操作

select
* from student;

declare

cursor cur
is select
* from student
for
update of name nowait;

begin

for i
in cur loop

UPDATE student
set name='1'
where
current of cur;

end loop;

end;

--select * from student;

流程控制语句

条件语句

---条件语句

--if

declare

v_score number(5,2):=&分数;

v_Result varchar(100):='';

begin

if v_score>0
and v_score<60
then

v_result:='未及格';

elsif v_score<80
then

v_result:='中';

elsif v_score<90
then

v_result:='良';

else

v_result:='优';

end
if;

dbms_output.put_line(v_result);

end;

--case

declare

v_score varchar2(4):=&级别;

v_Result varchar(100):='';

begin

case
upper(trim(v_score))

when
'D'
then

v_result:='未及格';

when
'C'
then

v_result:='中';

when
'B'
then

v_result:='良';

when
'A'
then

v_result:='优';

else

v_result:='未知';

end
case;

dbms_output.put_line(v_result);

end;

循环语句

-- for

declare

i number:=0;

j number:=0;

icount number:=10;

str
varchar(20):='';

begin

for i
in 1.. icount loop

str:='';

for j
in 1 .. icount-i loop

str:=str
||'*';

end loop;

dbms_output.put_line(str);

end loop;

end ;

--while循环

declare

cursor cur
is select
* from student;

st student%rowtype;

begin

open cur;

dbms_output.put_line('查询的条数:'
|| cur%rowcount);

loop

exit
when cur%notfound;

fetch cur
into st;

dbms_output.put_line(st.name ||st.no
||st.sex );

end loop;

close cur;

end;

函数

create
or replace
function fun_sum
return
number is

Result number;

begin

select
count(*)
into Result
from student ;

return(Result);

end fun_sum;

-- select fun_sum from dual

create
or replace
function fun_Sum_stu(v_name
varCHAR)

return
number is sun
number:=0;

begin

select
sum(to_number(no))
into sun
from student
where name=v_name;

return sun;

end fun_Sum_stu;

存储过程

create
or replace
procedure pro_find
is

result number;

begin

select
count(*)
into result
from student ;

end pro_find;

触发器

create
or replace
trigger tr_out

before update
on student

for each row

declare

-- local variables here

begin

dbms_output.put_line('修改前数据:'||:old.name
|| :old.no
|| :old.sex);

dbms_output.put_line('修改后数据:'||:new.name
|| :new.no
|| :new.sex);

end tr_out;update student
set name='12'
where no='2'
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: