PLSQLWord文件下载.docx
《PLSQLWord文件下载.docx》由会员分享,可在线阅读,更多相关《PLSQLWord文件下载.docx(36页珍藏版)》请在冰点文库上搜索。
![PLSQLWord文件下载.docx](https://file1.bingdoc.com/fileroot1/2023-5/6/5edadb0f-2adb-4838-8512-cf59bbe2e93e/5edadb0f-2adb-4838-8512-cf59bbe2e93e1.gif)
var_idnumber;
var_namevarchar2(30);
var_id:
=1001;
var_name:
3.变量的修饰
constantnotnull
eg.var_idconstantnumber:
=100;
var_namevarchar2(30)notnull:
=’a’;
一个变量声明为notnull必须赋初值,因为任何一个变量定义之后不赋值值都是null。
4变量数据类型
1.标量型(基本类型)
a)数字型(number,binary_integer)
b)字符型(char,varchar2(0-4K))
c)布尔型(boolean:
true,false,NULL)
d)日期型(date)
2.组合型
a)RECORD,TABLE,
3.参考类型引用类型
a)refcursor
4.大类型
a)CLOB(0-4G)
b)BLOB(0-4G)
c)BFILE(0-4G)(一般不使用这种类型,因为存储数据的路径就可以解决问题)
eg.
NUMBER(4,3)123.4567//错误超出精度
NUMBER(3,-3)1234//1000
NUMBER(4,6)0.0012345//0.001235
5.定义两个变量分别和s_emp表中id和first_name的类型相同
把id=1的数据赋值给这个两个变量然后输出
declare
var_idnumber(7);
var_namevarchar2(25);
selectid,first_nameintovar_id,var_namefroms_empwhereid=1;
dbms_output.put_line(var_id||var_name);
6.使用%type得到表的字段对应的类型
表名.字段名%type
var_ids_emp.id%type;
var_names_emp.first_name%type;
selectid,first_nameintovar_id,var_namefroms_empwhereid=2;
dbms_output.put_line(var_id||'
7.把s_emp表中的idfrist_namesalary对应的类型取出来定义变量,然后把id=1的数据赋值给first_namesalary输出这些信息
8.记录类型record类型
/*定义一个类似于c语言结构体类型*/
type类型名isrecord(
字段名类型,
字段名类型
);
把s_emp表中的idfrist_namesalary对应的类型取出来定义变量,然后把id=1的数据赋值给first_namesalary输出这些信息
--定义一个记录类型
typeemptypeisrecord(
ids_emp.id%type,
names_emp.first_name%type,
salarys_emp.salary%type
--使用类型定义变量
var_empemptype;
var_emp2emptype;
--使用sql给记录类型的变量赋值
selectid,first_name,salaryintovar_emp2froms_empwhereid=1;
var_emp:
=var_emp2;
--整体赋值
dbms_output.put_line(var_emp.id||'
'
||var_emp.name||'
||var_emp.salary);
当查询出的字段少于记录中的字段时,单独使用记录中的字段,没有赋值的字段是null:
selectfirst_name,salaryintovar_emp.name,var_emp.salaryfroms_empwhereid=1;
记录中的字段赋值
var_emp.name:
=var_emp2.name;
--(c语言用strcpy,区别)
var_emp.salary:
=var_emp2.salary;
表名%rowtype取得表的一行对应的类型
s_dept%rowtype
s_emp%rowtype
eg:
--使用表的一行的类型定义一个变量
var_emps_emp%rowtype;
select*intovar_empfroms_empwhereid=1;
dbms_output.put_line(var_emp.id||'
||var_emp.first_name||'
//%rowtype就是一个字段名和表头中的字段名和字段顺序完全相同的记录类型。
类似于c数组的类型table类型
TYPEtabletypeISTABLEOFtypeINDEXBYBINARY_INTEGER;
行的数目由BINARY_INTEGER的范围决定:
-214743648---214743647
Key没有必要是顺序的可以用firstlastnext方法遍历
--定义一个table类型
typenumstypeistableofs_emp.id%typeindexbybinary_integer;
var_numsnumstype;
var_indbinary_integer:
=1;
var_nums
(1):
var_nums
(2):
=200;
var_nums(3):
=600;
selectsalaryintovar_nums(4)froms_empwhereid=1;
dbms_output.put_line(var_nums(var_ind));
var_ind:
=var_ind+1;
---------------------------------------------------------------------
/*table
下标不连续迭代器思想
first()得到第一个元素对应的下标
last()最后一个元素对应的下标
next(n)根据一个元素的下标得到下一个元素的下标
*/
typenumstypeistableofs_emp.id%typeindexbybinary_integer;
=var_nums.first();
=var_nums.next(var_ind);
=var_nums.last();
typetbistableofs_emp%rowtypeindexbybinary_integer;
tb1tb;
bidbinary_integer:
select*intotb1
(1)froms_empwhereid=3;
--得到一条记录
select*intotb1(5)froms_empwhereid=7;
bid:
=tb1.first();
dbms_output.put_line(tb1(bid).id||'
||tb1(bid).first_name);
=tb1.next(bid);
变量的作用域和可见性
<
<
abc>
>
--指定标签abc
declare--嵌套
var_mnumber:
begin
declare
var_mnumber:
var_nnumber:
begin
/*局部可以访问全局的*//*同名则局部优先*/
dbms_output.put_line(var_m);
--访问局部变量
dbms_output.put_line(abc.var_m);
--变量前面加全局标签访问
end;
/*全局不能访问局部的*/
dbms_output.put_line(var_n);
--错误
end;
1.分支语句
a.ifa>
bthen
endif;
b.ifa>
else
c.ifa<
elsifa<
cthen
dthen
declare
anumber:
=10;
bnumber:
=20;
cnumber:
=5;
ifa<
a:
=b;
elsifa<
=c;
else
dbms_output.put_line('
aisthemaxnumber'
);
endif;
themaxnumber:
||a);
var_anumber;
var_bnumber;
var_cnumber;
var_dnumber;
var_enumber;
var_maxnumber;
var_a:
=&
var_a;
var_b:
var_b;
var_c:
var_c;
var_d:
var_d;
var_e:
var_e;
var_max:
=var_a;
ifvar_max<
var_bthen
=var_b;
var_cthen
=var_c;
var_dthen
=var_d;
var_ethen
=var_e;
maxnumber:
||var_max);
2.循环语句
a.简单循环
loop
/*循环代码*/
endloop;
/*如何退出循环*/
1)exitwhen退出条件;
//之间退出循环,不执行任何语句
2)if退出条件
语句;
//退出前可以执行一些语句
exit;
var_inumber;
var_i:
=1;
loop
dbms_output.put_line(var_i);
ifvar_i>
10then
exit;
=var_i+1;
--exitwhenvar_i>
10;
endloop;
loopover'
b.while循环
1.while循环的语法
while循环条件loop
endloop;
2.while循环举例:
输出1到10
whilevar_i<
=10loop
3.while循环的退出(同loop)
exitwhen退出条件
if退出条件then…exit;
c.for循环------智能循环
1.for循环的语法
for变量ina..bloop
2.for循环举例:
begin
forvar_iin1..10loop
3.for循环中的变量不允许修改
4.如何反向输出输出10到1
forvar_iinreverse1..10loop
5.for循环的退出,同while
d.循环的嵌套
1.例子
3.使用类似于c语言的goto语句
4.plsql中可以把标签放前面
3.goto语句
使用goto完成输出1到10
plsql中的sql使用
select语句要和into结合使用。
dml(insertdeleteupdate)tcl(commitrollbacksavepoint)可以直接在plsql中使用
DDL(createdropalter)不能直接在plsql中使用,需要使用动态sql。
-------------------------------------------------------------------------------------------------------------
回顾:
常见的访问oracle的技术
plsql
proc/c++
odbc/ado
sqlj/jdbc
plsql的程序结构
/*申明区
定义变量和类型*/
/*执行区
执行sql语句和plsql语句*/
exception
/*异常处理区
处理程序错误的*/
---------------------------
plsql中定义变量
1.使用sql中类型来定义变量
变量名类型;
2.binary_integerboolean
constantnotnull
4.给变量手动赋值
使用sql语句给变量赋值
5.表名.字段名%type取得表的字段对应的类型
6.记录类型
字段名类型,
字段名类型
如何给记录类型赋值
当查询的字段数少于记录类型字段数
记录类型之间的赋值整体选择字段赋值
7.表的一行对应的类型
表名%rowtype
8.table类型
类似c语言的数组
type类型名istableof表中的类型
indexbybinary_integer;
变量名(下标):
=值;
当下标连续时的遍历
当下标不连续
迭代器思想
first()
last()
next(n)
--------------------------------
变量的作用域和可见性
局部优先
标签名>
plsql的控制语句
1.分支语句
if条件then
elsif条件then
while循环条件loop
c.for循环
for变量ina..bloop
---------------
d.循环的退出
exitwhen退出条件
if退出条件then
f.循环的嵌套
通过在内层循环中改变条件退出外层循环
使用goto可以直接在内层循环退出外层循环
使用exit标签名
------------------
3.goto语句
使用goto完成输出1到10
begin
var_i:
myloop>
ifvar_i<
11then
=var_i+1;
gotomyloop;
myloopover!
---------------------------------------------
plsql中的sql使用
1.select语句要和into结合使用。
2.dml(insertdeleteupdate)
tcl(commitrollbacksavepoint)
可以直接在plsql中使用
3.DDL(createdropalter)不能直接在plsql
中使用,需要使用动态sql。
动态sql:
把一个字符串对应的sql当做sql语句来执行
createtabletestsql(idnumber);
//静态的,运行后不能修改
‘createtabletestsql(idnumber)’
1.DDL:
的动态sql--DDL必须要用动态的sql
2.DML的动态sql
-------------------------------------------------------------------------------
为了解决字符串拼接的问题使用占位符简化拼接
占位符冒号开头使用using替代占位符号。
3.select语句的动态sql
能且只能返回一个结果
游标:
用来处理多行数据的一个数据类型
一条sql语句可以认为是匿名游标
1.游标的语法
a)声明游标
curson游标名issql语句;
b)打开游标
open游标名;
c)提取数据
i.非滚动游标提取数据必须是顺序的
ii.fetch游标名into变量名;
d)关闭游标
close游标名;
2.例:
把s_emp表中所有的数据放入一个游标中
i.输出前两天的idfirst_namesalary
3.遍历游标中所有的数据
a)游标的属性
%found是否发现新数据
游标必须处于打开状态如果没有打开游标使用则返回非法游标。
游标至少被fetch过一次如果没fetch则返回NULL值。
发现了新数据就返回true,否则返回false。
%notfound是否没有发现新数据
游标必须处于打开状态否则是非法游标
没有fetch则返回NULL值
发现了新数据就返回false,没有发现新数据就返回true.
%isopen游标是否打开
打开就返回true否则返回false
打开的游标不能在打开,关闭的游标不能在关闭。
%r