PL/SQL学习笔记
来源:互联网 发布:ibeer free软件可乐 编辑:程序博客网 时间:2024/05/22 06:59
PL/SQL程序是按照块结构进行划分
块是PL/SQL程序的基本单位
declare:用于声明变量,游标
v_name varchar2(30):='jack';
v_weekday constant number(10):=7;
begin:表示程序的开始
Dbms_output.put_line(v_name);
Dbms_output.put_line('常量'|| v_weekday);
||表示两个变量相连接
select 列名 into 变量 from 表名
exception:表示异常
exception when others then
dbms_output.put_line('出现异常了'||sqlerrm);
end; :表示程序结束,分号结尾
流程控制:
if condition then
Statements
end if;
if condition1 then
Statements1
elsif condition2 then
Statements1
end if;
declare
v_num number(2) :=&请输入数字
begin
if v_num=1 then
dbms_output.put_line('优秀');
elsif
end if;
end;
declare
v_num number;
begin
loop
//产生一个随机数字
v_num:=mod(dbms_Random.random(),10);
dbms_output.put_line('数字是'||v_num);
if v_num>100 then
exit;
endif;
endloop;
end;
declare
v_sum number(8):=0;
begin
for i in 1..100
loop
v_sum:=v_sum+i;
end loop;
dbms_output.put_line(v_sum);
end;
动态SQL:
在运行的时候执行一个建表的语句,建立的表结构由用户来决定
declare
v_sql varchar2(300):='&请输入建表的SQL语句';
begin
execute immediate v_sql;
dbms_output.put_line('创建成功');
exception when others then
dbms_output.put_line('执行有异常');
end;
declare
v_id number(6):=&请输入id;
v_name varchar2(90);
v_sql varchar2(100):='select xueyuanminzi from xueshenbiao where xueyuanid=:1';
begin
execute immediate v_sql into v_name using v_id;
dbms_output.put_line(v_name);
end;
using:给语句中的点位符赋值
v_name xueshengbiao.xuiyuanmingzi%type;//声明这个变量类型和这个表的列的数据类型一样
v_xuesheng xueshengbiao%rowtype;//一个学员信息表的行类型,表示存储学员信息表的所有列
v_name:=dbms_random.string('i',10);//随机产生一个长度为10的字符串
---------------------------------------------------
创建一张表userinfo(usid number,uname varchar2(50),upass varchar2(50));
declare
v_sql varchar2(100):='create table userinfo(uuid number(9),uname varchar2(30),upass varchar2(30))';
v_sqlname userinfo.uname%type:=dbms_random.string('u',10);
v_sqlpass userinfo.upass%type:=dbms_random.string('u',10);
v_tablecount number(3);
begin
select count(*) into v_tablecount from user_tables where table_name='USERINFO';
if v_tablecount=1 then
execute immediate 'drop table userinfo';
end if;
execute immediate v_sql;
for i in 1..100
loop
execute immediate 'insert into userinfo values(:a,:b,:c)'using i,v_sqlname,v_sqlpass;
end loop;
commit;
exception when others then
dbms_output.put_line('出错了'||sqlerrm);
end;
----------------------------------------------------------
--------赌局游戏------
declare
v_sqll varchar2(200):='create table duju(dujuid number(18),dujukaibao number(2),dujuxiazhu number(2),jieguo number(2),benjin number(5))';
v_sum number:=100;
v_kaibao number;
v_xiazhu number;
v_jieguo number;
v_tablecount number;
begin
select count(*) into v_tablecount from user_tables where table_name='DUJU';
if v_tablecount=1 then
execute immediate 'drop table duju';
end if;
execute immediate v_sqll;
for i in 1..1000
loop
select trunc(dbms_random.value(0,2)) into v_kaibao from dual;
if v_kaibao=0 then
v_kaibao:=-1;
end if;
if i=1 then
execute immediate 'insert into duju(dujuid,dujukaibao,jieguo,benjin) values(:a,:b,:c,:d)' using i,v_kaibao,0,v_sum;
else
if v_xiazhu=v_kaibao then
v_jieguo:=1;
v_sum:=v_sum+1;
else
v_jieguo:=-1;
v_sum:=v_sum-1;
end if;
execute immediate 'insert into duju values(:a,:b,:c,:d,:e)' using i,v_kaibao,v_xiazhu,v_jieguo,v_sum;
end if;
v_xiazhu:=v_kaibao;
commit;
end loop;
dbms_output.put_line('结果是:' || v_sum);
exception when others when
dbms_output.put_line(sqlerrm);
end;
-----------------------------------------------------------
--游标:常用于保存查询的结果
declare
begin
update banji set banjimincheng='bj'
dbms_output.put_line(sql%rowcount);
end;
--显示游标的使用
--声明游标
--打开游标
--摘取游标
--关闭游标
-------------------
--查询一列的游标
declare
cursor c_cur is select banjimingcheng from hanji;
v_banjimingcheng banji.banjimingcheng%type;--定义banjimingcheng这个类型的变量
begin
open c_cur;
loop
fetch c_cur into v_banjimingcheng;
if c_cur%notfound then
exit;
end if;
dbms_output.put_line('班级名称'||v_banjimingcheng);
end loop;
close c_cur;
end;
------------------
--查询一行的游标
declare
cursor c_topicname is select * from topid;
v_topicname topid%rowtype;--定义topid表的一行类型的变量
begin
open c_topicname;
fetch c_topicname into v_topicname;
dbms_output.put_line('主题ID'||v_topicname.topicid||'主题名称'||v_topicname.topicname||'父主题'||v_topicname.parentid);
close c_topicname;
end;
---------------
--用for循环的游标
declare
cursor c_topicname is select * from topid;
begin
for i in c_topicname
loop
dbms_output.put_line('主题ID'||v_topicname.topicid||'主题名称'||v_topicname.topicname||'父主题'||v_topicname.parentid);
end loop;
end;
-----------------------
--带参数的游标
declare
cursor c_topicname(v number) is select * from topid;
i topid%rowtype;
begin
open c_topicname(1);
loop
fetch c_topicname into i;
if i%notfound then
exit;
end if;
dbms_output.put_line(i.topicid||' '||i.topicname);
end loop;
end;
----------------------------------
--动态游标:一个游标用于多个表查询
declare
TYPE MYCURTYPE is ref cursor;--声明了一个自己的游标类型
c_cur MyCURTYPE;--声明该游标类型的变量
v_flag number:=&请选择查询的信息1班级表2用户表
v_banji banji%rowtype;
v_userinfo userinfo%rowtype;
begin
if v_flag=1 then
open c_cur for select * from banji;
loop
fetch c_cur into v_banji;
if c_cur%notfound then
exit
end if;
dbms_output.put_line('班级名称'|| v_banji.banjimingcheng);
end loop;
elsif v_flag=2 then
open c_cur for select * from userinfo;
loop
fetch c_cur into v_userinfo;
if c_cur%notfound then
exit
end if;
dbms_output.put_line('用户名称'|| v_userinfo.uname);
end loop;
close c_cur;
end;
块是PL/SQL程序的基本单位
declare:用于声明变量,游标
v_name varchar2(30):='jack';
v_weekday constant number(10):=7;
begin:表示程序的开始
Dbms_output.put_line(v_name);
Dbms_output.put_line('常量'|| v_weekday);
||表示两个变量相连接
select 列名 into 变量 from 表名
exception:表示异常
exception when others then
dbms_output.put_line('出现异常了'||sqlerrm);
end; :表示程序结束,分号结尾
流程控制:
if condition then
Statements
end if;
if condition1 then
Statements1
elsif condition2 then
Statements1
end if;
declare
v_num number(2) :=&请输入数字
begin
if v_num=1 then
dbms_output.put_line('优秀');
elsif
end if;
end;
declare
v_num number;
begin
loop
//产生一个随机数字
v_num:=mod(dbms_Random.random(),10);
dbms_output.put_line('数字是'||v_num);
if v_num>100 then
exit;
endif;
endloop;
end;
declare
v_sum number(8):=0;
begin
for i in 1..100
loop
v_sum:=v_sum+i;
end loop;
dbms_output.put_line(v_sum);
end;
动态SQL:
在运行的时候执行一个建表的语句,建立的表结构由用户来决定
declare
v_sql varchar2(300):='&请输入建表的SQL语句';
begin
execute immediate v_sql;
dbms_output.put_line('创建成功');
exception when others then
dbms_output.put_line('执行有异常');
end;
declare
v_id number(6):=&请输入id;
v_name varchar2(90);
v_sql varchar2(100):='select xueyuanminzi from xueshenbiao where xueyuanid=:1';
begin
execute immediate v_sql into v_name using v_id;
dbms_output.put_line(v_name);
end;
using:给语句中的点位符赋值
v_name xueshengbiao.xuiyuanmingzi%type;//声明这个变量类型和这个表的列的数据类型一样
v_xuesheng xueshengbiao%rowtype;//一个学员信息表的行类型,表示存储学员信息表的所有列
v_name:=dbms_random.string('i',10);//随机产生一个长度为10的字符串
---------------------------------------------------
创建一张表userinfo(usid number,uname varchar2(50),upass varchar2(50));
declare
v_sql varchar2(100):='create table userinfo(uuid number(9),uname varchar2(30),upass varchar2(30))';
v_sqlname userinfo.uname%type:=dbms_random.string('u',10);
v_sqlpass userinfo.upass%type:=dbms_random.string('u',10);
v_tablecount number(3);
begin
select count(*) into v_tablecount from user_tables where table_name='USERINFO';
if v_tablecount=1 then
execute immediate 'drop table userinfo';
end if;
execute immediate v_sql;
for i in 1..100
loop
execute immediate 'insert into userinfo values(:a,:b,:c)'using i,v_sqlname,v_sqlpass;
end loop;
commit;
exception when others then
dbms_output.put_line('出错了'||sqlerrm);
end;
----------------------------------------------------------
--------赌局游戏------
declare
v_sqll varchar2(200):='create table duju(dujuid number(18),dujukaibao number(2),dujuxiazhu number(2),jieguo number(2),benjin number(5))';
v_sum number:=100;
v_kaibao number;
v_xiazhu number;
v_jieguo number;
v_tablecount number;
begin
select count(*) into v_tablecount from user_tables where table_name='DUJU';
if v_tablecount=1 then
execute immediate 'drop table duju';
end if;
execute immediate v_sqll;
for i in 1..1000
loop
select trunc(dbms_random.value(0,2)) into v_kaibao from dual;
if v_kaibao=0 then
v_kaibao:=-1;
end if;
if i=1 then
execute immediate 'insert into duju(dujuid,dujukaibao,jieguo,benjin) values(:a,:b,:c,:d)' using i,v_kaibao,0,v_sum;
else
if v_xiazhu=v_kaibao then
v_jieguo:=1;
v_sum:=v_sum+1;
else
v_jieguo:=-1;
v_sum:=v_sum-1;
end if;
execute immediate 'insert into duju values(:a,:b,:c,:d,:e)' using i,v_kaibao,v_xiazhu,v_jieguo,v_sum;
end if;
v_xiazhu:=v_kaibao;
commit;
end loop;
dbms_output.put_line('结果是:' || v_sum);
exception when others when
dbms_output.put_line(sqlerrm);
end;
-----------------------------------------------------------
--游标:常用于保存查询的结果
declare
begin
update banji set banjimincheng='bj'
dbms_output.put_line(sql%rowcount);
end;
--显示游标的使用
--声明游标
--打开游标
--摘取游标
--关闭游标
-------------------
--查询一列的游标
declare
cursor c_cur is select banjimingcheng from hanji;
v_banjimingcheng banji.banjimingcheng%type;--定义banjimingcheng这个类型的变量
begin
open c_cur;
loop
fetch c_cur into v_banjimingcheng;
if c_cur%notfound then
exit;
end if;
dbms_output.put_line('班级名称'||v_banjimingcheng);
end loop;
close c_cur;
end;
------------------
--查询一行的游标
declare
cursor c_topicname is select * from topid;
v_topicname topid%rowtype;--定义topid表的一行类型的变量
begin
open c_topicname;
fetch c_topicname into v_topicname;
dbms_output.put_line('主题ID'||v_topicname.topicid||'主题名称'||v_topicname.topicname||'父主题'||v_topicname.parentid);
close c_topicname;
end;
---------------
--用for循环的游标
declare
cursor c_topicname is select * from topid;
begin
for i in c_topicname
loop
dbms_output.put_line('主题ID'||v_topicname.topicid||'主题名称'||v_topicname.topicname||'父主题'||v_topicname.parentid);
end loop;
end;
-----------------------
--带参数的游标
declare
cursor c_topicname(v number) is select * from topid;
i topid%rowtype;
begin
open c_topicname(1);
loop
fetch c_topicname into i;
if i%notfound then
exit;
end if;
dbms_output.put_line(i.topicid||' '||i.topicname);
end loop;
end;
----------------------------------
--动态游标:一个游标用于多个表查询
declare
TYPE MYCURTYPE is ref cursor;--声明了一个自己的游标类型
c_cur MyCURTYPE;--声明该游标类型的变量
v_flag number:=&请选择查询的信息1班级表2用户表
v_banji banji%rowtype;
v_userinfo userinfo%rowtype;
begin
if v_flag=1 then
open c_cur for select * from banji;
loop
fetch c_cur into v_banji;
if c_cur%notfound then
exit
end if;
dbms_output.put_line('班级名称'|| v_banji.banjimingcheng);
end loop;
elsif v_flag=2 then
open c_cur for select * from userinfo;
loop
fetch c_cur into v_userinfo;
if c_cur%notfound then
exit
end if;
dbms_output.put_line('用户名称'|| v_userinfo.uname);
end loop;
close c_cur;
end;
0 0
- PL/SQL学习笔记
- PL/SQL学习笔记
- PL/SQL学习笔记
- PL/SQL学习笔记
- PL/SQL学习笔记
- PL/SQL学习笔记
- PL/SQL学习笔记
- PL/SQL学习笔记
- PL/SQL学习笔记
- PL/SQL 学习笔记!
- PL/SQL 学习笔记!
- PL/SQL学习笔记
- pl/sql学习笔记
- PL/SQL 学习笔记
- PL/SQL学习笔记
- PL/SQL学习笔记
- PL/SQL学习笔记
- PL/SQL 学习笔记
- 责任链模式(Chain of Responsibility)
- uva 572
- HSV(HSV颜色模型)
- iframe自适应高度问题
- 判断是否为AJAX 请求原理
- PL/SQL学习笔记
- 使用Mantle处理Model层对象
- static全局、局部变量,全局变量及局部变量
- mysql varchar 的最大长度
- Socket 的学习
- 黑马程序员——java基础增强反射的学习
- 五月是你的谎言
- Git 公开项目
- MD5