oracle高级部分:开整。
pl/sql简介。
pl/sql是结构化查询语言(sql)和oracle过程语言(pl)的扩展集。可以通过pl/sql完成这样的事情比如:存储过程,存储函数,触发器………包括程序包。
也就是说:pl/sql也是一种编辑器,那么pl/sql也是一门语言。
pl/sql程序。
所有的pl/sql程序都是包含在称之为(block)的结构中。那么当你创建一个存储过程或者存储函数的时候,就要给对应的**块一个名字。如果没有给**块起名字,那么这个**块就是匿名**块。
块相当于j**a中的匿名游离块(游离块测试时候是比较方便的),有名字的就叫存储过程,或函数,存储过程和函数是不可跨平台的。
练习:使用存储块进行数据库的插入操作。
declare
p constant number :=1111;--定义一个常量,值是不可以变的。
price number定义一个常量。
num number;
str varchar2(100);
idz 要想跨平台只能这么定义变量,上面定义方式就不行了。
begin --程序块开始执行。
price :=10;--给变量赋值。
num :=price * p;--进行计算同时给变量赋值。
idz :=11;
insert into nc_hd_a values(1, price, num);-执行指定的sql
commit;--提交事务。
insert into nc_hd_duo values(idz,str||'ddd',22);
commit;
dbms_'dfdsfdsafdsa'||p);-输出内置函数。
end;--程序块结束。
select * from user_all_tables
select * from user_tab_cols where table_name='nc_hd_zm_d_tzyy'
声明部分。声明部分是程序块的开始。并且用declare关键字开始,后面跟着变量和游标的定义。可以定义具有常量值的变量,并且变量可以继承已经存在的列和查询结果中的数据类型。
定义方式如下:
变量名类型当一个数据是常量的时候,要如下定义。
常量名 constant 类型 :=具体值;
也可以用default来进行声明如下:常量名 constant 类型 default 具体值;
游标:一种自动(**的,select自带**游标),一种定义(显性的)。游标是个容器:第一次放在结果集第一行的上面。
j**a在获取数据库的时候是一行一行迭代取,其实实现原理就是游标。所以这就是说为什么j**a在处理sybase数据库特别繁琐,因为它没有游标。
关系数据库中的操作是在完整的行集合上执行的。由 select 语句返回的行集合包括满足该语句的 where 子句所列条件的所有行。由该语句返回完整的行集合叫做结果集。
应用程序,尤其是互动和**应用程序,把完整的结果集作为一个单元处理并不总是有效的。这些应用程序需要一种机制来一次处理一行或连续的几行。而游标是对提供这一机制的结果集的扩展。
游标是通过游标库来实现的。游标库是常常作为数据库系统或数据访问 api 的一部分而得以实现的软件,用来管理从数据源返回的数据的属性(结果集)。这些属性包括并发管理、在结果集中的位置、返回的行数,以及是否能够在结果集中向前和/或向后移动(可滚动性)。
游标跟踪结果集中的位置,并允许对结果集逐行执行多个操作,在这个过程中可能返回至原始表,也可能不返回至原始表。换句话说,游标从概念上讲基于数据库的表返回结果集。由于它指示结果集中的当前位置 ,就像计算机屏幕上的光标指示当前位置一样,“游标”由此得名。
使用游标前的准备。
%type属性。
在pl/sql中可以将变量和常量声明为内建或用户定义的数据类型,以引用一个列名,同时继承他的数据类型和大小。这种动态赋值方法是非常有用的,比如变量引用的列的数据类型和大小改变了,如果使用了%type,那么用户就不必修改**,否则就必须修改**。
定义方式如下:变量名当前用户名。表名。列名%type; idz
好处:以后写存储过程的时候有个概念:资源表和字典表不是一个东西啊。
资源表:是将数据库里所有存储过程和函数可能使用到的变量的数据类型全部定义在这。好处:
换数据库的时候只要改变资源表就可以了,一处变了处处变。
扩展。不但列名可以使用%type,而且变量、游标、记录,或声明的常量都可以使用%type。这对于定义相同数据类型的变量非常有用。
定义方式:变量名1 用户名。表名。列名%type; 新的变量名变量名1%type;
idz dddd idz%type;
found和%notfound
游标有记录则返回true否则false ,可以用来判断游标的执**况。
%notfound和%found 正好相反,个人认为可以通用。
在执行任何dml语句前%found和%notfound的值都是null,在执行dml语句后,sql%found的属性值将是:true :insert
true :delete和update,至少有一行被delete或update.
true :select into至少返回一行
当%found为true时,%notfound为false。
rowcount
返回游标取回数据的数目。
在执行任何dml语句之前,sql%rowcount的值都是null,对于select语句,如果执行成功,%rowcount的值为1,如果没有成功,%rowcount的值为0,同时产生一个异常no_data_found.
isopen
%isopen是一个布尔值,如果游标打开,则为true, 如果游标关闭,则为false.对于隐式游标而言%isopen总是false,这是因为隐式游(查询)标在dml语句执行时打开,结束时就立即关闭。
游标使用_隐式游标。
在oracle中游标分为2种:一种是隐式游标、一种是显式游标。
隐式游标使用(隐士游标是自己开自己关的,select语句自带隐士游标)
特定对于查询语句执行的时候自动的打开这个游标。查询结束的又自动的关闭这个游标。
例如:declare
idz named
beginselect id,name into named,idz from nc_hd_a where id = 11; -隐式游标一定要返回1行数据才行,多行报错。
dbms_'=named); 输出内置函数。
insert into nc_hd_duo values(idz,named,333);
commit;
end;问题:当你的查询语句的返回结果多于一条的时候,就不能用隐式游标。如果使用会报异常。
显式游标(显式游标必须定义并且需要开启和关闭)
特点:可以处理多条返回数据;但是要手动的设定游标的开启和关闭。同时要手动的进行数据的设定。
定义一个新的显示游标要使用关键字:
cursor定义方式:
cursor 新游标名字 cursormy is 要进行多条查询的查询语句。
open cursormy 手动开启游标。
fetch cursormy into id,name 变量名,手动设置游标开始执行。
close cursormy 手动进行游标的关闭。
例如:declare
cursor cursormy is
select id, name from nc_hd_a where id is not null;
id name id%type;
dd id%type;
beginopen cursormy;
fetch cursormy
into id, name;
close cursormy;
dbms_end;
上面的游标处理虽然可以处理多条数据,但是却不能将所有的数据都返回给控制台,只是不在报出错误了,但是游标总是指向了第一条数据。
流程控制。if--else
在pl/sql种的if和else的写法有些不同格式如下。
if 条件注意这里没有括号,也没有分号。
then要进行处理的**。
elsif 条件同上。
then要进行处理的**。
else要进行处理的**。
end if;结束。
类如:declare
idd constant number :=1000;
beginif idd = 100 then
dbms_elsif idd = 1000 then
dbms_else
dbms_end if;
end;循环使用:pl/sql种包括3种循环((解决上面显式游标查询多条但是显示一条问题,就是压游标))
1、 简单循环:在循环中当执行到exit或者exit when时跳出循环。
简单循环loop的使用。
declare
v_a v_b v_a%type;
cursor cursor_name is
select id, name from nc_hd_a;
beginopen cursor_name打开游标。
loop开始循环。
fetch cursor_name --开始执行游标。
into v_a, v_b; -通过循环的方式获得游标中的数据同时将值付给变量。
exit when cursor_name%notfound; -当在游标中再也找不到记录的时候跳出循环体
dbms_' end loop结束循环。 close cursor_name关闭游标必须做的,但是要在循环体以外。 end; include 直接按标准目录搜索。先在当前目录搜索,再搜索标准目录。处理过程 预编译时,用被包含文件的内容取代该预处理命令,再对 包含 后的文件作一个源文件编译。if else elif endif 条件编译指令中最常用的或许是 if,else,elif和 endif if的一般形式是 if co... 1 查看表的结构 desc tabledescription 2 set timing on 打开操作表的时间记录。3 消除重复行 distinct 4 大小写不区分的是列名,而不是里面的数据。1 可以对某一列直接进行加减乘除。两列相加。2 如果有一列为null,所得结果也为空。使用nvl函数处理n... 第1页1.oracle 的使用 1.1.sqlplus 的命令 初始化表的位置 set nls lang american 设置编码才可以使用下面脚本 cd oracle home rdbms cd demo 我们目前使用的是oralce 9i 9201 版本 select from v versi...部分c高级笔记
oracle笔记
Oracle笔记