`
crackit
  • 浏览: 10466 次
  • 性别: Icon_minigender_1
  • 来自: 南京
最近访客 更多访客>>
社区版块
存档分类
最新评论

Oracle PL/SQL学习笔记

阅读更多

Oracle PL/SQL 学习笔记

-- 案例
create or replace procedure sp_pro2 is
begin
-- 执行部分
delete from mytest where name ='name1';
end;

-- 最简单的块
begin  
   qdbms_output.put_line('hello world');
end;

--- 有定义和执行部分的块
declare 
   --定义变量
   v_ename varchar2(5);
   v_sal number(7,2);
begin
   -- 执行部分
   select ename,sal into v_ename,v_sal from emp where empno = &no;
  /* select sal into v_sal from emp where empno = &no;*/
   dbms_output.put_line('employeer: ' || v_ename || ' salary: ' || v_sal);
exception
   -- 异常处理
   when no_data_found then
   dbms_output.put_line('朋友,请重新输入编号');
end;
/

-- 案例4
create procedure sp_pro3(spName varchar2,newSal number) is
begin
       --执行部分-- 根据用户名去修改工资
       update emp set sal = newSal where ename =spName;
end;


-- 函数案例
-- 输入雇员的姓名,返回该雇员的年薪
create function sp_fun2(spName varchar2) 
       return number is
       yearSal number(7,2);
begin
--执行部分
select sal * 12 + nvl(comm,0) * 12 into yearSal from emp where ename = spName;
return yearSal;
end;



-- 创建包
-- 创建一个包 sp_package
-- 声明该包有一个过程
-- 声明该包有一个函数
create package sp_package is
       procedure update_sal(name varchar2,newsal number);
       function annual_income(name varchar2) return number;
end;


-- 给包 sp_package 实现包体
create or replace package body sp_package is
procedure update_sal(name varchar2,newsal number)
is
begin
          update emp set sal = newsal where ename = name;
end;
function annual_income(name varchar2)
return number is
annual_salary number;
begin
           select sal*12+nvl(comm,0) into annual_salary from emp
           where ename = name;
           return annual_salary;
end;
end;


-- 案例
declare
   c_tax_rate number(3,2):=0.03;
   --用户名
   v_ename emp.ename%type;
   v_sal number(7,2);
   v_tax_sal number(7,2);
begin
   --执行部分
   select ename,sal into v_ename,v_sal from emp where empno=&no;
   --计算所得税
   v_tax_sal:=v_sal*c_tax_rate;
   --输出
   dbms_output.put_line('姓名:' || v_ename ||',工资:' || v_sal || '所得税:'|| v_tax_sal);
end;

--pl/sql记录实例
declare
  --定义一个pl/sql记录类型emp_record_type,
  -- 类型保护三个数据name,salary,title
  type emp_record_type is record(
       name emp.ename%type,
       salary emp.sal%type,
       title emp.job%type
  );
  -- 定义了一个sp_record变量,这个变量类型是emp_record_type
  sp_record emp_record_type;
begin
  select ename,sal,job into sp_record
  from emp where empno=7788;
  dbms_output.put_line('员工名:' || sp_record.name || ',工资是' || sp_record.salary);
end;


-- pl/sql 表实例

declare
-- 定义一个pl/sql表类型sp_table_type,该类型是用于存放emp.ename%type
-- index by binary_integer表示下标是整数
type sp_table_type is table
of emp.ename%type index by binary_integer;
-- 定义一个sp_table变量,这个变量的类型是sp_table_type
sp_table sp_table_type;
begin
         select ename into sp_table(0) from emp where empno=7788;
         dbms_output.put_line('员工名:' || sp_table(0));
end;

-- pl/sql cursor实例
declare
-- 定义游标类型
type sp_emp_cursor is ref cursor;
-- 定义一个游标变量
test_cursor sp_emp_cursor;
-- 定义变量
v_ename emp.ename%type;
v_sal emp.sal%type;
begin
-- 执行部分
-- 把test_cursor 和一个select结合
open test_cursor for select ename,sal from emp where deptno=&no;
--循环取出
loop
     fetch test_cursor into v_ename,v_sal;
     -- 判断工资高低,决定是否更新
     
     -- 判断是否test_cursor为空
     exit when test_cursor%notfound;
     dbms_output.put_line('名字:'||v_ename||',工资:'|| v_sal);
end loop;
end;


-- procedure test
create or replace procedure sp_pro6(spName varchar2) is
       --定义
       v_sal emp.sal%type;
begin
      --执行
      select sal into v_sal from emp where ename=spName;
      --判断
      if v_sal <2000 then
         update emp set sal = sal*1.1 where ename=spName;
      end if;      
end;

-- procedure test2
create or replace procedure sp_pro6(spName varchar2) is
       --定义
       v_comm emp.comm%type;
begin
      --执行
      select comm into v_comm from emp where ename=spName;
      --判断
      if v_comm != 0 then
         update emp set comm =comm + 100 where ename=spName;
      else
         update emp set comm = comm + 200 where ename=spName;
      end if;     
end;

-- procedure if elsif
create or replace procedure sp_pro6(spNo number) is
  -- 定义
  v_job emp.job%type;
begin
  -- 执行
  select job into v_job from emp where empno = spNo;
  if v_job = 'PRESIDENT' then
    update emp set sal = sal + 1000 where empno = spNo;
  elsif v_job = 'MANAGER' then
    update emp set sal = sal + 500 where empno = spNo;
  else
    update emp set sal = sal + 200 where empno = spNo;
  end if;
end;

-- loop test
create or replace procedure sp_pro6(spName varchar2) is
       -- 定义 :=表示赋值
       v_num number:=1;
begin
loop
       insert into users values(v_num,spName);
       -- 判断退出条件
       exit when v_num = 10;
       -- 自增
       v_num:= v_num +1;
end loop;
end;


-- while test;
create or replace procedure sp_pro6(spName varchar2) is
       -- 定义 :=表示赋值
       v_num number:=11;
begin
       while v_num <=20 loop
       -- 执行
       insert into users values(v_num,spName);
       v_num:=v_num+1;
       end loop;
end;

-- goto test
declare
  i int := 1;
begin
  loop
    dbms_output.put_line('i=' || i);
    if i = 10 then
      goto end_loop;
    end if;
    i := i + 1;
  end loop;
  <<end_loop>>
  dbms_output.put_line('end loop');
end;

-- 创建表
create table book(
  bookId number(4,2),
  bookName varchar2(50),
  publishHouse varchar2(50)
);

-- 编写过程
-- in 表示输入参数, 默认为in
-- out 表示输出参数
create or replace procedure sp_pro7(spBookId in number,
                   spbookName in varchar2,
                   sppublishHouse in varchar) is
begin
  insert into book values(spBookId,spbookName,sppublishHouse);
end;
         
-- 有输入和输出的存储过程
create or replace procedure sp_pro8
(spNo in number,spName out varchar2,
 spSal out number,spJob out varchar2) is
begin
      select ename,sal,job into spName,spSal,spJob from emp where empno = spNo;
end;                   

-- 返回结果集的过程
-- 1.创建一个包,在该包中定义一个类型test_cursor,一个游标
create or replace package testpackage as
       type test_cursor is ref cursor;
end testpackage;

-- 2. 创建存储过程
create or replace procedure sp_pro9(spNo in number,
       p_cursor out testpackage.test_cursor) is
begin
       open p_cursor for select * from emp where deptno=spNo;
end;

-- 3. 如何在java中调用


-- oracle 的分页

select rownum rn,t1.* from (select * from emp) t1

select rownum rn,t1.* from (select * from emp) t1 where rownum < 10;

-- 在分页时,大家可以把下面的sql语句当成模板使用
select * from 
(select rownum rn,t1.* from (select * from emp) t1 where rownum <= 10)
where rn >= 6;


-- 开发一个包
create or replace package testPackage as
       type test_cursor is ref cursor;
end testPackage;

-- 开始编写分页的过程
create or replace procedure fenye
(tableName in varchar2,
 pageSize in number, -- 一页现实记录数
 pageNow in number, 
 myrows out number, -- 总记录数
 myPageCount out number, -- 总页数
 p_cursor out Testpackage.test_cursor -- 返回记录集
 ) is
 -- 定义部分
 -- 定义sql语句 字符串
 v_sql varchar2(1024);
 -- 定义两个整数
 v_begin number:=(pageNow-1)*pageSize + 1;
 v_end number:=pageNow*pageSize;
 begin
 -- 执行部分
 v_sql:='select * from (select rownum rn,t1.* from (select * from '||
 tableName||' order by sal) t1 where rownum <= '||v_end||') where rn >= '||v_begin||'';
 -- 把游标和sql语句关联起来
 open p_cursor for v_sql;
 -- 计算myRows和myPageCount
 -- 组织一个SQL
 v_sql:='select count(*) from ' || tableName;
 -- 执行SQL,并把返回的值,赋给myRows
 execute immediate v_sql into myRows;
 -- 计算myPageCount
  if mod(myRows,pageSize)=0 then
    myPageCount := myRows/pageSize;
  else
    myPageCount := myRows/pageSize + 1;
  end if;
  
  -- 关闭游标
  -- close p_cursor;
 end; 
 -- 使用java测试
 
 
 -- 新的需要,排序

 -- 例外案例
 declare
 -- 定义
 v_name emp.ename%type;
 begin
    select ename into v_name from emp where empno = &no;
    dbms_output.put_line('name: '|| v_name);
 exception
    when no_data_found then
         dbms_output.put_line('no not exist');
 end;
 
 -- 自定义例外
 create or replace procedure ex_test(spNo number) 
 is
 -- 定义一个例外
 myex exception;
 
 begin
   -- 更新用户sal
   update emp set sal = sal + 1000 where empno= spNo;
   -- sql%notfound 这是表示没有update
   -- raise myex; 触发myex
   if sql%notfound then
      raise myex;
   end if;
   exception
       when myex then
       dbms_output.put_line('not update success');
 end;    
 
 
 -- 创建视图,把emp表薪水sal<1000 的雇员映射该视图(view)
 create view myview as select * from emp where sal < 1000;
 
 create view myview as select emp.empno,emp.ename,dept.dname from emp,dept
 where emp.deptno = dept.deptno
 

 

分享到:
评论

相关推荐

    ORACLE PL/SQL从入门到精通

    ORACLE PL/SQL是从入门到精通的专业知识,涵盖了数据库开发与管理的多个方面,包括...这本书籍将为读者提供一个全面、系统的学习路径,帮助数据库管理员、开发人员深入理解并掌握ORACLE PL/SQL的强大功能和应用技巧。

    pl/sql学习笔记

    以下是对PL/SQL的学习笔记的详细解析: 1. **什么是PL/SQL语言** PL/SQL是Oracle数据库为数据库管理员和开发人员设计的一种编程语言。它扩展了SQL的功能,允许编写包含控制结构、变量、过程和函数的程序段,这些...

    PL/SQL学习笔记

    PL/SQL是Oracle公司开发的一种过程化SQL扩展,它是Oracle数据库的重要组成部分,用于在数据库服务器上编写存储过程、函数、触发器、包等可执行代码。PL/SQL可以处理复杂的数据操作和业务逻辑,支持编程结构如循环、...

    pl/sql数据库学习笔记

    PL/SQL数据库学习笔记 PL/SQL是一种高级的程序语言,主要用于Oracle数据库管理系统中。下面是PL/SQL数据库学习笔记的知识点总结。 一、基本原则 *瀑布模型:需求分析→设计(概要设计,详细设计:SQL语句,变量...

    PL/SQL学习教程,附笔记

    PL/SQL,全称是Procedural Language/Structured Query Language,是Oracle数据库提供的一种结合了SQL语言和过程式编程的编程环境。它扩展了SQL的功能,使得开发人员能够编写复杂的数据库应用程序,处理事务、实现...

    我的PL/SQL学习笔记(一)

    在这个“我的PL/SQL学习笔记(一)”中,我们将探讨PL/SQL的基础知识,包括其语法结构、变量声明、流程控制以及如何与Oracle数据库中的数据进行交互。 首先,PL/SQL的基本结构分为声明部分、执行部分和异常处理部分...

    oracle/SQL和PL/SQL课堂笔记

    Oracle SQL和PL/SQL是数据库管理和编程的重要工具,主要用于...这些笔记提供了学习SQL和Oracle数据库操作的基本框架,对于初学者来说是非常有价值的资源。通过实践和深入学习,可以掌握更复杂的查询技巧和PL/SQL编程。

    PL/SQl超级笔记

    总的来说,“PL/SQL超级笔记”应该涵盖了从基本语法到高级特性的全面教程,通过学习,新手可以逐步掌握如何使用PL/SQL进行数据库编程,从而更好地管理和操作Oracle数据库。配合"oracle_ppt"中的PPT材料,学习效果会...

    PL/SQL听课笔记

    ### PL/SQL听课笔记 #### 一、PL/SQL简介 **PL/SQL**(Procedural Language for SQL)是一种专门为Oracle数据库设计的过程化语言扩展。它是在标准SQL基础上增加了一系列高级编程特性,如变量、控制结构、函数、...

    PL/SQL学习笔记5

    在PL/SQL的学习中,分区是数据库管理大型数据集的一种高效方法,特别是在处理大数据量时。本篇笔记主要探讨了何时应该使用分区以及Oracle支持的分区类型。 首先,当面对超过2GB的大数据表时,分区是十分必要的。这...

    sql,PL/SQl学习笔记

    本文将深入探讨从"SQL,PL/SQL学习笔记"中提取的关键知识点,帮助编程人员更好地理解和运用这两种语言。 首先,我们关注SQL并行查询。通过`ALTER SESSION ENABLE PARALLEL DMl`,我们可以开启会话的并行DML操作,这...

    oracle PL-SQL 学习笔记2

    根据提供的文件信息,我们可以将其中的关键知识点归纳如下: ### 1. 创建无参数的Procedure(过程) 在Oracle PL/SQL中,创建一个无参数的过程(Procedure)是...这些内容为深入学习Oracle PL/SQL打下了坚实的基础。

    pl/sqle学习笔记

    ### PL/SQL 学习笔记知识点详解 #### 1. PL/SQL 基本结构 - **DECLARE**: 在此部分声明变量、常量、数据类型及游标。 - **BEGIN**: 主程序体开始,可以包含任何合法的PL/SQL语句。 - **EXCEPTION**: 异常处理部分,...

    pl/sql学习小结笔记

    PL/SQL,全称Procedural Language/Structured Query Language,是Oracle数据库的一种扩展语言,用于处理数据库中的数据和实现复杂的业务逻辑。以下是对PL/SQL的基础知识进行的详细阐述: 1. **匿名块与命名块**: ...

    oracle PL-SQL 学习笔记1

    从给定的Oracle PL-SQL学习笔记中,我们可以提炼出一系列关键的知识点,涉及PL-SQL的基本语法、变量声明与赋值、数据类型、表操作、记录与集合处理等核心概念。下面将对这些知识点进行详细阐述: ### 1. 变量声明与...

Global site tag (gtag.js) - Google Analytics