PLSQL.docx

上传人:b****3 文档编号:4393874 上传时间:2023-05-07 格式:DOCX 页数:36 大小:168.44KB
下载 相关 举报
PLSQL.docx_第1页
第1页 / 共36页
PLSQL.docx_第2页
第2页 / 共36页
PLSQL.docx_第3页
第3页 / 共36页
PLSQL.docx_第4页
第4页 / 共36页
PLSQL.docx_第5页
第5页 / 共36页
PLSQL.docx_第6页
第6页 / 共36页
PLSQL.docx_第7页
第7页 / 共36页
PLSQL.docx_第8页
第8页 / 共36页
PLSQL.docx_第9页
第9页 / 共36页
PLSQL.docx_第10页
第10页 / 共36页
PLSQL.docx_第11页
第11页 / 共36页
PLSQL.docx_第12页
第12页 / 共36页
PLSQL.docx_第13页
第13页 / 共36页
PLSQL.docx_第14页
第14页 / 共36页
PLSQL.docx_第15页
第15页 / 共36页
PLSQL.docx_第16页
第16页 / 共36页
PLSQL.docx_第17页
第17页 / 共36页
PLSQL.docx_第18页
第18页 / 共36页
PLSQL.docx_第19页
第19页 / 共36页
PLSQL.docx_第20页
第20页 / 共36页
亲,该文档总共36页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

PLSQL.docx

《PLSQL.docx》由会员分享,可在线阅读,更多相关《PLSQL.docx(36页珍藏版)》请在冰点文库上搜索。

PLSQL.docx

PLSQL

常见访问oracle的技术

PLSQL过程化sqlprocedure(存储过程)

pro*c/c++使用c和c++访问oracle数据库

odbc/adovc访问数据库的技术

sqlj/jdbcjava访问数据库的技术

PL/SQL

PL/SQL(ProceduralLanguage/SQL)是在标准SQL的基础上增加了过程化处理的语言。

plsql扩展了sql

变量和数据类型

控制结构ifforgoto

过程和函数

对象类型和方法

PL/SQL程序结构

QL/SQL块

声明部分,declare//声明区,定义变量和定义类型

执行部分,begin//执行区,执行sql语句和qlsql语句

异常处理,exception//异常处理区,处理错误的区域

结束,end;

sqlplus命令行下的开发工具

图形开发工具:

plsqldevelopersqlprogramer

 

设置输出

setserveroutputon//设置输出

begin

dbms_output.put_line(‘helloplsql’);

end;

/

1.变量的声明和定义

declare

var_idnumber:

=100;/*变量定义和初始化*/

var_namevarchar2(30):

='test';

begin

dbms_output.put_line(var_id||':

'||var_name);

end;

2.变量的赋值

declare

var_idnumber;/*变量定义和初始化*/

var_namevarchar2(30);

begin

var_id:

=1001;

var_name:

='test';

dbms_output.put_line(var_id||':

'||var_name);

end;

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);

begin

selectid,first_nameintovar_id,var_namefroms_empwhereid=1;

dbms_output.put_line(var_id||var_name);

end;

6.使用%type得到表的字段对应的类型

表名.字段名%type

declare

var_ids_emp.id%type;

var_names_emp.first_name%type;

begin

selectid,first_nameintovar_id,var_namefroms_empwhereid=2;

dbms_output.put_line(var_id||':

'||var_name);

end;

7.把s_emp表中的idfrist_namesalary对应的类型取出来定义变量,然后把id=1的数据赋值给first_namesalary输出这些信息

8.记录类型record类型

/*定义一个类似于c语言结构体类型*/

type类型名isrecord(

字段名类型,

字段名类型,

字段名类型

);

把s_emp表中的idfrist_namesalary对应的类型取出来定义变量,然后把id=1的数据赋值给first_namesalary输出这些信息

declare

--定义一个记录类型

typeemptypeisrecord(

ids_emp.id%type,

names_emp.first_name%type,

salarys_emp.salary%type

);

--使用类型定义变量

var_empemptype;

var_emp2emptype;

begin

--使用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);

end;

当查询出的字段少于记录中的字段时,单独使用记录中的字段,没有赋值的字段是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:

declare

--使用表的一行的类型定义一个变量

var_emps_emp%rowtype;

begin

select*intovar_empfroms_empwhereid=1;

dbms_output.put_line(var_emp.id||''||var_emp.first_name||''||var_emp.salary);

end;

//%rowtype就是一个字段名和表头中的字段名和字段顺序完全相同的记录类型。

类似于c数组的类型table类型

TYPEtabletypeISTABLEOFtypeINDEXBYBINARY_INTEGER;

行的数目由BINARY_INTEGER的范围决定:

-214743648---214743647

Key没有必要是顺序的可以用firstlastnext方法遍历

declare

--定义一个table类型

typenumstypeistableofs_emp.id%typeindexbybinary_integer;

var_numsnumstype;

var_indbinary_integer:

=1;

begin

var_nums

(1):

=100;

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;

dbms_output.put_line(var_nums(var_ind));

var_ind:

=var_ind+1;

dbms_output.put_line(var_nums(var_ind));

var_ind:

=var_ind+1;

dbms_output.put_line(var_nums(var_ind));

end;

---------------------------------------------------------------------

/*table

下标不连续迭代器思想

first()得到第一个元素对应的下标

last()最后一个元素对应的下标

next(n)根据一个元素的下标得到下一个元素的下标

*/

declare

--定义一个table类型

typenumstypeistableofs_emp.id%typeindexbybinary_integer;

var_numsnumstype;

var_indbinary_integer:

=1;

begin

var_nums

(1):

=100;

var_nums

(2):

=200;

var_nums(3):

=600;

selectsalaryintovar_nums(4)froms_empwhereid=1;

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));

var_ind:

=var_nums.next(var_ind);

dbms_output.put_line(var_nums(var_ind));

var_ind:

=var_nums.last();

dbms_output.put_line(var_nums(var_ind));

end;

declare

typetbistableofs_emp%rowtypeindexbybinary_integer;

tb1tb;

bidbinary_integer:

=1;

begin

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);

bid:

=tb1.next(bid);

dbms_output.put_line(tb1(bid).id||''||tb1(bid).first_name);

end;

变量的作用域和可见性

<>--指定标签abc

declare--嵌套

var_mnumber:

=1;

begin

declare

var_mnumber:

=100;

var_nnumber:

=100;

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>bthen

else

endif;

c.ifa

elsifa

elsifa

endif;

eg:

declare

anumber:

=10;

bnumber:

=20;

cnumber:

=5;

begin

ifa

a:

=b;

elsifa

a:

=c;

else

dbms_output.put_line('aisthemaxnumber');

endif;

dbms_output.put_line('themaxnumber:

'||a);

end;

declare

var_anumber;

var_bnumber;

var_cnumber;

var_dnumber;

var_enumber;

var_maxnumber;

begin

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_max:

=var_b;

endif;

ifvar_max

var_max:

=var_c;

endif;

ifvar_max

var_max:

=var_d;

endif;

ifvar_max

var_max:

=var_e;

endif;

dbms_output.put_line('maxnumber:

'||var_max);

end;

2.循环语句

a.简单循环

loop

/*循环代码*/

endloop;

/*如何退出循环*/

1)exitwhen退出条件;//之间退出循环,不执行任何语句

2)if退出条件

语句;//退出前可以执行一些语句

exit;

endif;

eg:

declare

var_inumber;

begin

var_i:

=1;

loop

dbms_output.put_line(var_i);

ifvar_i>10then

exit;

endif;

var_i:

=var_i+1;

--exitwhenvar_i>10;

endloop;

dbms_output.put_line('loopover');

end;

b.while循环

1.while循环的语法

while循环条件loop

endloop;

2.while循环举例:

输出1到10

declare

var_inumber;

begin

var_i:

=1;

whilevar_i<=10loop

dbms_output.put_line(var_i);

var_i:

=var_i+1;

endloop;

end;

3.while循环的退出(同loop)

exitwhen退出条件

if退出条件then…exit;endif;

c.for循环------智能循环

1.for循环的语法

for变量ina..bloop

endloop;

2.for循环举例:

输出1到10

begin

forvar_iin1..10loop

dbms_output.put_line(var_i);

endloop;

end;

3.for循环中的变量不允许修改

4.如何反向输出输出10到1

begin

forvar_iinreverse1..10loop

dbms_output.put_line(var_i);

endloop;

end;

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的程序结构

declare

/*申明区

定义变量和类型*/

begin

/*执行区

执行sql语句和plsql语句*/

exception

/*异常处理区

处理程序错误的*/

end;

---------------------------

plsql中定义变量

1.使用sql中类型来定义变量

变量名类型;

2.binary_integerboolean

3.变量的修饰

constantnotnull

4.给变量手动赋值

使用sql语句给变量赋值

5.表名.字段名%type取得表的字段对应的类型

6.记录类型

type类型名isrecord(

字段名类型,

字段名类型,

字段名类型

);

如何给记录类型赋值

当查询的字段数少于记录类型字段数

记录类型之间的赋值整体选择字段赋值

7.表的一行对应的类型

表名%rowtype

8.table类型

类似c语言的数组

type类型名istableof表中的类型

indexbybinary_integer;

变量名(下标):

=值;

当下标连续时的遍历

当下标不连续

迭代器思想

first()

last()

next(n)

--------------------------------

变量的作用域和可见性

局部优先

<<标签名>>

--------------------------------

plsql的控制语句

1.分支语句

if条件then

endif;

if条件then

else

endif;

if条件then

elsif条件then

elsif条件then

else

endif;

2.循环语句

a.简单循环

loop

endloop;

b.while循环

while循环条件loop

endloop;

c.for循环

for变量ina..bloop

endloop;

---------------

d.循环的退出

exitwhen退出条件

if退出条件then

exit;

endif;

f.循环的嵌套

通过在内层循环中改变条件退出外层循环

使用goto可以直接在内层循环退出外层循环

使用exit标签名

------------------

3.goto语句

使用goto完成输出1到10

declare

var_inumber;

begin

var_i:

=1;

<>

ifvar_i<11then

dbms_output.put_line(var_i);

var_i:

=var_i+1;

gotomyloop;

endif;

dbms_output.put_line('myloopover!

');

end;

---------------------------------------------

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2