`
周一Monday
  • 浏览: 346767 次
  • 来自: 北京
社区版块
存档分类
最新评论

PL/SQL入门

阅读更多
--声明变量

  --普通变量
    v_name varchar2(12):='aaa';
    v_count number(4);

  --通过%TYPE属性为变量声明类型
   v_ename emp.ename%type;
   v_sal emp.sal%type;
   
--*************************************************************************************************************
--利用匿名块从数据库中查据输出到控制台上  
declare
    v_deptno dept.deptno%type;
    v_dname  dept.dname%type;
    v_loc    dept.loc%type;
begin
    select t.deptno,t.dname,t.loc into v_deptno,v_dname,v_loc  from dept t where t.deptno=10;
    dbms_output.put_line('v_deptno='||v_deptno);
    dbms_output.put_line('v_dname='|| v_dname);
    dbms_output.put_line('v_loc='|| v_loc);
end;

----利用匿名块插入数据到数据库中 
declare
begin
   insert into dept(deptno,dname,loc)values(50,'java','shanghai');
   commit;
end;


--*************************************************************************************************************
--if  then end if 
--如果名字是monday,输出hello monday
declare
 v_name  varchar2(12):='monday';
begin
  if v_name='monday' then
     dbms_output.put_line('hello monday');
  end if;
end; 

--if-then-else 
--如果名字是monday,输出hello monday,否则输出hello
declare
  v_name varchar2(12):='java';
begin
  if v_name='monday' then
     dbms_output.put_line('hello monday');   
  else
     dbms_output.put_line('hello');     
  end if;
end;


--if-then-elsif--else 
--如果名字是monday,输出hello monday,如果名字是java,输出hello java,否则输出hello
declare
  v_name  varchar2(12):='sql';
begin
  if v_name='monday' then
     dbms_output.put_line('hello monday');
  elsif v_name='java' then
     dbms_output.put_line('hello java');   
  else
     dbms_output.put_line('hello');
  end if;
end;
--**********************************************************************************************************
--loop
--循环输出从0-5  步长是1
declare
   v_i integer:=0;
begin
   loop 
       dbms_output.put_line(v_i);
       v_i:=v_i+1;
       exit when (v_i>5);
   end loop;
end;

--***********************************************************************************************************
--for  
--输出从0-5 步长是1
--正向输出
begin
  for v_i in 0..5 loop
      dbms_output.put_line(v_i);
  end loop;
end;

--反向输出
begin
  for v_i in reverse 0..5 loop
      dbms_output.put_line(v_i);
  end loop;
end;

--***********************************************************************************************************
--while
--循环输出0-5 步长是1
--正向输出
declare
  v_i integer:=1;
begin
  while v_i>0 loop
       dbms_output.put_line(v_i);
       v_i:=v_i+1;
      exit when (v_i>5); 
  end loop;
end;

--反向输出
declare
  v_i integer:=5;
begin
  while v_i>0 loop
       dbms_output.put_line(v_i);
       v_i:=v_i-1;
  end loop;
end;


--***********************************************************************************************************
--存储过程

--插入数据的存储过程,参数有外部传入
create or replace procedure insertProc
(
      v_deptno in dept.deptno%type,
      v_dname  in dept.dname%type,
      v_loc    in dept.loc%type
)
is
begin
      insert into dept(deptno,dname,loc) values(v_deptno,v_dname,v_loc);
      commit;
end;

--调用存储过程
execute insertProc(60,'oracle','beijing'); --要使用命令行执行

--带返回值的更新的存储过程,更新数据到dept表中
create or replace procedure updateProc
(
       v_deptno in dept.deptno%type,
       v_dname  in dept.dname%type,
       v_loc    in dept.loc%type,
       v_result out varchar2
)
is
begin
    update dept set dname=v_dname,loc=v_loc where deptno=v_deptno;
    commit;
    v_result:='update success';
end;

select * from dept;
--***********************************************************************************************************
--存储过程的应用案例

--账户表
create table t_account
(
     id       varchar(20), --帐号
     balance  number(9,2)  --余额
);
--存款表
create table t_inaccount
(
     id         varchar(20), --帐号
     inbalance  number(9,2)  --存入金额
);
--插入一个帐号
insert into t_account(id,balance) values('9999',1000);
commit;

--创建存款的存储过程

create or replace procedure accountProc
(
    v_id              in        t_inaccount.id%type,
    v_inbalance       in        t_inaccount.inbalance%type
)
is
    v_balance    t_account.balance%type;  --保存账户表的金额
begin
    --往存款表插入存款
    insert into t_inaccount(id,inbalance)values(v_id,v_inbalance);
    --查询账户表原来的金额
    select balance into v_balance from t_account  where id=v_id;
    --现在账户表的金额=原来的金额+新存款的金额
    v_balance:=v_balance+v_inbalance;
    --更新账户表的金额为现在账户表的金额
    update t_account  set balance=v_balance where id=v_id;
    --提交
    commit;
end;
--***********************************************************************************************************

--函数
--根据值返回税额
create or replace function tax(v_value in number)
   return number
is
begin
     if (v_value<1000) then 
        return v_value*0.1;
     elsif (v_value>=1000 and v_value<=2000) then
        return v_value*0.2;  
     else
        return v_value*0.3;   
     end if;   
end;   
select tax(1300) from dual;      
  
--***********************************************************************************************************
--触发器
--语句级DML触发器 
create or replace trigger deptTrigger
   before
   insert or update or delete
   on dept
begin
   dbms_output.put_line('调用了语句触发器');
end;   

update dept set loc='shanghai' where deptno=70;
     
--行级DML触发器
create or replace trigger deptTriggerRow
     before
     insert or update or delete
     on dept
     for each row
begin
     dbms_output.put_line('调用了行级触发器');
end;         
  
update dept set loc='shanghai' where deptno=70;
  

--***********************************************************************************************************
--触发器的应用1 
create table t_user
(
       id    integer ,
       username varchar2(20),
       password varchar2(20),
       primary key(id)
);

create table t_login
(
       id       integer ,
       username varchar2(20),
       password varchar2(20),
       primary key(id)
);

create or replace trigger insertLogin
  before
  insert
  on t_user
  for each row
begin
   insert into t_login(id,username,password)values(:new.id,:new.username,:new.password);
end;  
insert into t_user(id,username,password)values(1,'aaa','123');

--触发器的应用2
create or replace trigger deleteLogin
  before 
  delete
  on t_user
  for each row
begin
   delete from t_login where id=:old.id;
end;  

delete from t_user where id=1;


--***********************************************************************************************************
--游标
select * from dept; --游标就是结果集

--声明游标
v_deptno dept.deptno%type;
v_dname  dept.dname%type;
v_loc  dept.loc%type;

cursor deptCursor is select detpno,dname,loc from dept where deptno=10 ;      
             
--打开游标将执行查询和取出结果集
open deptCursor;

--检索当前记录的值到输出变量中。
fetch deptCursor into v_deptno,v_dname,v_loc;

--在对查询到的所有记录的处理完成后,关闭游标
close deptCursor;

--**********************************************************************************************************
--单行游标
declare
  v_deptno dept.deptno%type;
  v_dname dept.dname%type;
  v_loc dept.loc%type;
  cursor deptCursor is select * from dept where deptno=10; 
begin
   open  deptCursor;
         fetch deptCursor into v_deptno,v_dname,v_loc;
         dbms_output.put_line(v_deptno || ' ' || v_dname || ' ' || v_loc);
   close deptCursor;
end;

--多行游标
declare
  v_deptno dept.deptno%type;
  v_dname  dept.dname%type;
  v_loc    dept.loc%type;
  cursor  deptCursor is select * from dept;
begin
   open  deptCursor;
     --是否打开游标
     if deptCursor %isopen then
       dbms_output.put_line('-----------游标打开-----------');
     end if;
     loop
       fetch deptCursor into v_deptno,v_dname,v_loc;
        --是否有数据提取
       if deptCursor %found then
          dbms_output.put_line('有数据');
       elsif  deptCursor % notfound then  
          dbms_output.put_line('无数据');
       end if;
       exit when (deptCursor %notfound);
       dbms_output.put_line('第' || deptCursor%rowcount || '行:' || v_deptno || ' ' || v_dname || ' ' || v_loc);
     end loop;
   close deptCursor;
   dbms_output.put_line('-----------游标关闭-----------');
end;

--*********************************************************************************************
--异常
declare
   v_deptno dept.deptno%type;
   v_dname dept.dname%type;
   v_loc dept.loc%type;
begin
   select * into v_deptno,v_dname,v_loc from dept ;
   --select * into v_deptno,v_dname,v_loc from dept where deptno=99;
exception
 when no_data_found then
   rollback;
   dbms_output.put_line('没有数据');   
 when too_many_rows then
    rollback;
   dbms_output.put_line('数据过多');
 when others then
   rollback;
   dbms_output.put_line('其他异常');
end;

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

declare
  v_id integer:=4;
  v_name varchar(20):='ddd';
begin
  insert into test(id,name)values(v_id,v_name);
  commit;
end;
---------------------------------------------------------------
declare
 v_id integer:=4;
begin
 delete from test where id=v_id;
 commit;
end;

declare
   v_count integer:=0;
begin
  if v_count > 3 then
     dbms_output.put_line('>3');
  elsif  v_count >=1 and v_count <=3 then
     dbms_output.put_line('>=1 and <=3');
  else   
     dbms_output.put_line('<1');
  end if;
end;
---------------------------------------------------------------
declare
   v_num integer:=100;
   v_result varchar2(10);
begin
   v_result:=
     case v_num
       when 1 then 'one'
       when 2 then 'two'
       when 3 then 'three'
       else 'unknow'
     end;
   dbms_output.put_line('v_num=' || v_num || ' v_result=' || v_result);  
end;
---------------------------------------------------------------
declare
   v_i integer:=1;
begin
  loop
    dbms_output.put_line(v_i);
    v_i:=v_i+1;
    exit when (v_i>5);
  end loop;
end;
---------------------------------------------------------------
declare
  v_i integer:=1;
begin
   while v_i>0 loop
     dbms_output.put_line(v_i);
     v_i:=v_i+1;
     exit when (v_i>5);
   end loop;
end;
---------------------------------------------------------------
declare
  v_i integer:=1;
begin
  for v_i in /*reverse*/ 1..5 loop
    dbms_output.put_line(v_i);
  end loop;
end;
/* PL/SQL 中有goto */
---------------------------------------------------------------
declare
   v_id test.id%type;
   v_name test.name%type;
   cursor cursor_test is select id,name from test;
begin
   open  cursor_test;
     fetch cursor_test into v_id,v_name;
     while cursor_test %found loop
        dbms_output.put_line(v_id || '---' || v_name);
        fetch cursor_test into v_id,v_name;
     end loop;
   close cursor_test;
end;
---------------------------------------------------------------

 

分享到:
评论

相关推荐

    PL/SQL入门到精通书的源代码

    本资料“PL/SQL入门到精通书的源代码”是一份针对初学者到高级用户的实践教程,旨在帮助读者深入理解和掌握PL/SQL的各个方面。 在学习PL/SQL时,你需要了解以下几个关键知识点: 1. **基础语法**:PL/SQL由声明...

    非常合适的PL/sql 入门

    【PL/SQL 入门详解】 PL/SQL(Procedural Language/Structured Query Language)是Oracle公司为标准SQL添加的编程扩展,它被深度集成到Oracle数据库系统中,成为数据库管理和开发的重要工具。PL/SQL提供了更丰富的...

    Oracle Database 10g PL/SQL入门教程

    Oracle Database 10g PL/SQL入门教程是针对初学者设计的一份教程,旨在帮助读者掌握Oracle数据库系统中PL/SQL编程语言的基础知识。PL/SQL是Oracle数据库特有的编程语言,它结合了SQL(结构化查询语言)的功能,用于...

    ORACLE PL/SQL从入门到精通

    ORACLE PL/SQL是从入门到精通的专业知识,涵盖了数据库开发与管理的多个方面,包括触发器、过程、函数、软件包、异常处理、游标、循环、分支、变量使用、数据库安装等关键知识点。 触发器是数据库中用来保证数据...

    oracle pl/sql从入门到精通 配套源代码

    这本书"Oracle PL/SQL从入门到精通"的配套源代码,显然是为了帮助读者通过实践来深入理解和掌握Oracle数据库的编程技术。 首先,让我们探讨Oracle PL/SQL的基础知识。PL/SQL是Oracle数据库的内置编程语言,由块构成...

    整理:oracle pl/sql 入门+ 数组使用+游标+动态SQL

    1. Oracle PL/SQL入门: - PL/SQL的基本结构:PL/SQL由声明部分、执行部分和异常处理部分组成,用于定义变量、常量、游标、过程、函数等。 - 数据类型:了解PL/SQL中的内置数据类型,如NUMBER、VARCHAR2、DATE等,...

    java中Oracle Database 10g PL/SQL入门教程

    【标题】"Java中Oracle Database 10g PL/SQL入门教程"的描述涉及了学习Java编程语言,并特别提到了Oracle Database 10g的PL/SQL编程。Oracle Database 10g是一款关系型数据库管理系统,广泛应用于企业级数据存储和...

    oracle pl/sql入门教程

    本入门教程旨在帮助初学者快速理解并掌握Oracle PL/SQL的基础知识,通过丰富的实例来解析其核心概念。 一、PL/SQL简介 PL/SQL是Oracle数据库提供的过程化语言,它允许开发者编写包含SQL语句的程序块,用于执行复杂...

    Oracle 11g SQL和PL SQL从入门到精通 pdf格式电子书 下载(一)

    Oracle 11g SQL和PL SQL从入门到精通 pdf格式电子书 下载(一) http://download.csdn.net/source/3268267 Oracle 11g SQL和PL SQL从入门到精通 pdf格式电子书 下载(二) ...

    Oracle PL/SQL程序设计(第5版)(上下册)

    ### Oracle PL/SQL程序设计(第5版)(上下册)知识点概述 #### 一、PL/SQL编程基础 - **PL/SQL简介**:PL/SQL(Procedural Language for SQL)是Oracle数据库的一种内嵌式过程化语言,用于增强SQL的功能。它允许在SQL...

    Oracle存储过程和触发器(PL/SQL入门教程)

    Oracle存储过程和触发器(PL/SQL入门教程) Oracle存储过程和触发器(PL/SQL入门教程)

    Oracle 11g SQL和PL SQL从入门到精通 pdf格式电子书 下载(二)

     本书是专门为oracle应用开发人员提供的sql和pl/sql编程指南。通过学习本书,读者不仅可以掌握oracle常用工具oracle universal installer、net comfiguration assistant、sql developer、sql*plus的作用及使用方法...

    PL/SQL开发文档1

    标题中提到的“PL/SQL开发文档1”,说明本文档是关于PL/SQL开发的入门级指导材料,面向希望学习使用PL/SQL进行数据库程序单元开发的用户。文档很可能是Oracle公司内部或其授权的培训机构用于教学目的的官方材料。 ...

    pl/sql入门教程

    plsql入门 游标变量 Oracle EXTRACT()函数 用Java调用存储过程 ORACLE用户常用数据字典的查询使用方法

    Oracle11g SQL和PL/SQL从入门到精通.part1

    学习oracle sql pl/sql入门的很不错的一本书。

    PL/SQL入门PPT

    快速了解PL/SQL的使用,属于专业培训机构的内部讲义。也可以用作普通数据库操作的温习。

    pl/sql学习笔记

    PL/SQL(Procedural Language/Structured Query Language)是Oracle数据库中的过程式编程语言,它结合了SQL查询语句和传统的过程式编程元素,使得在数据库管理中进行复杂逻辑处理成为可能。以下是对PL/SQL的学习笔记...

    Oracle PL/SQL编程及最佳实践

    Oracle PL/SQL 编程及最佳实践 Oracle PL/SQL 是一种高级编程语言,用于开发 Oracle 数据库中的存储过程、函数和触发器。PL/SQL language 提供了强大的编程能力,可以实现复杂的业务逻辑,并且与 Oracle 数据库紧密...

Global site tag (gtag.js) - Google Analytics