设为首页 收藏本站
查看: 474|回复: 0

[经验分享] Oracle数据库之PLSQL基础

[复制链接]

尚未签到

发表于 2016-8-12 06:46:50 | 显示全部楼层 |阅读模式
--===================================PLSQL基础篇============================
-- 数据类型:
----  标量类型:数字 number,字符 varchar,varchar2,char,日期 ,
--             布尔 boolean (true,false,null)(存储单个值)
---  复合类型:record,集合类型 (存放多个值的变量)
---  参照类型:cursor
---  LOB 类型:存储大数据类型(BFILE,BLOB,CLOB,NCLOB);
--============ ===================================
---  EMP , DEPT 表;
--===============================================
--变量声明
declare
v_realName  varchar2(20);
-- := 赋值符号
v_baseCost  number(7,2) :=5.9; --定义number类型,赋值5.9
v_count binary_integer :=0;
v_start boolean not null default false;
begin
select 'hello ' into v_realname from dual; -- 给 v_realName变量赋值
dbms_output.put_line('v_realName--'||v_realName);
dbms_output.put_line('v_baseCost---'||v_baseCost);
dbms_output.put_line('v_count---'||v_count);
end;
-- 执行 用  " / " ,下述同样操作

--dbms_output.put_line('v_start---'||v_start); -- boolean类型的不能输出,不能插入,不能将列值保存到boolean变量中
-- 只能对boolean变量执行逻辑操作(见后逻辑语句)
-- %type: 变量具有数据库的表中某列或其它变量相同的类型
declare
v_name emp.ename%type;
begin
select ename into v_name from emp where empno = 7900;
dbms_output.put_line('v_name---'||v_name);
end;

-- Record类型:处理单行多列问题
-- record变量的引用:记录类型变量的属性引用方法 " . "
declare
--t_emp_rec是记录类型
type t_emp_rec is record   (
name  emp.ename%TYPE,   -- name 是t_emp_rec的成员.
job emp.job%TYPE);
emp_rec     t_emp_rec; -- 声明--t_emp_rec记录类型的变量
begin
select ename , job  into emp_rec from emp where empno = 7900; -- 读取数据到record类型
-- select ename , job , sal   into emp_rec from emp where empno = 7900; -- error,没有足够的列值
dbms_output.put_line('emp_rec-name---'||emp_rec.name);
dbms_output.put_line('emp_rec-job---'||emp_rec.job);
end ;


-- 用%rowtype来定义record类型(作用:简化record的定义).
--  当使用%rowtype定义记录类型时,record成员的名称和类型与表或者视图的列名称和类型完全相同.
declare
v_emp emp%rowtype ; -- v_cost的名称和类型和 cost表一样
begin
select *   into v_emp from emp where empno = 7900; -- 读取数据到record类型
dbms_output.put_line('v_emp-name---'||v_emp.ename);
end ;

--================================================================
--=========流程控制:=============

/*
if 布尔表达式
then xxxx
elsif 布尔表达式
then      xxxx
else        xxxx
end if;
*/
declare
v_var boolean not null default false;
v_int integer :=5;   
begin
if v_var
then  dbms_output.put_line('v_var: true');
else
dbms_output.put_line('v_var: false');
-- then dbms_output.put_line('v_var: false'); error
end  if; --必须结束if
-- 多个if嵌套
if(v_int > 5)
then  dbms_output.put_line('v_int: >5');
elsif (v_int > 2)
then  dbms_output.put_line('v_int: >2');
else
dbms_output.put_line('v_int: else');
end if;
end ;

/*
loop循环:
loop
语句 1 ;
语句 2;
exit when 表达式;
end loop;
*/
declare
v_int integer :=3;
begin
loop
dbms_output.put_line('v_int:'||v_int);   
v_int :=v_int+1;
if(v_int > 10)
then exit; --退出
end if;
--exit when v_int > 10; 可以出现在循环的任何位置,注意是when ,不是then;
end loop;
end;


--where循环:
/*
while 布尔表达式 loop
语句1;
语句2;
end loop;
*/
declare
v_int integer :=1;
begin
while v_int < 10 loop
dbms_output.put_line('v_int:'||v_int);   
v_int :=v_int+1;
end loop;
end;

/*
for循环:
for 循环计数器 in 下限 .. 上限 loop
语句1;
语句1;
end loop;
*/
declare
v_int integer :=0;
begin
for v_int in 1 .. 10 loop
-- 循环 包括1,包括10;
dbms_output.put_line('v_int:'||v_int);   
--v_int :=v_int+1; v_int不能用来作为赋值目标
end loop;
end;

-- for循环 倒序
declare
v_int integer :=10;
begin
for v_int in reverse 1 .. 10 loop
dbms_output.put_line('v_int:'||v_int);   
--v_int :=v_int+1; v_int不能用来作为赋值目标
end loop;
end;

--Notice: v_int 是 1.. 10循环中的每个变量,不能用来作为赋值目标
--    把 v_int 初始化为5,输出的结果跟初始化为0是一样.类似如下的java程序:
int j = 5;
for (j = 1 ;j <= 10 ; j++){
System.out.println(j); //  1 .... 10;
}

--NULL
--NULL语句不会执行任何操作,并且会直接将控制传递到下一条语句,使用NULL语句主要是提高程序的可阅读性
DECLARE
v_sal emp.sal%TYPE;
v_ename emp.ename%TYPE;
BEGIN
SELECT ename,sal into v_ename,v_sal FROM emp WHERE empno=7900;
IF v_sal<3000 then
UPDATE emp SET comm=sal*1.2 WHERE ename=v_ename;
ELSE
NULL;
END IF;
END;

  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-256523-1-1.html 上篇帖子: ORACLE查询结果集的问题 下篇帖子: Oracle数据库之PLSQL集合
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表