`

PLSQL学习笔记

阅读更多
新建emp表
create table emp(
  eno number,
  ename varchar2(20),
  sal number,
  job varchar2(20),'
  dept varchar2(20)
);


存储过程基本内容
--条件判断
  --1、if ... then elseif then ... else ... end if;
  --2、case ... when ... then ... end;

--循环结构
  --1、loop ... exit when ... end loop;
  --2、while ... loop ... end loop;
  --3、for i in ... loop ... end loop;
  --4、goto exit;

--游标(类似java中的Iterator)

--异常的处理(三种方式)

--会写存储函数和存储过程

--会写触发器



hello world代码
set serveroutput on

declare
  --声明的变量、类型、游标
begin
  --程序执行部分(类似于java里的main)
  dbms_output.put_line('helloworld');
--exception
   --针对begin块中的异常,提供处理机制
   --when......then......
   --when......then......
end;



declare声明变量
declare
  --声明的变量、类型、游标
  v_ename emp.ename%type;
  v_sal emp.sal%type;
  v_job emp.job%type;
begin
  --程序执行部分(类似于java里的main)
  select ename,sal,job into v_ename,v_sal,v_job from emp where eno=1;
  dbms_output.put_line(v_ename||','||v_sal||','||v_job);
--exception
   --针对begin块中的异常,提供处理机制
   --when......then......
   --when......then......
end;


声明记录类型
declare
  --声明一个记录类型
  type emp_record is record(
  v_ename emp.ename%type,
  v_sal emp.sal%type,
  v_job emp.job%type
  );
  --定义一个记录类型的成员变量
  v_emp_record emp_record;
begin
  --程序执行部分(类似于java里的main)
  select ename,sal,job into v_emp_record from emp where eno=1;
  dbms_output.put_line(v_emp_record.v_ename||','||v_emp_record.v_sal||','||v_emp_record.v_job);
--exception
   --针对begin块中的异常,提供处理机制
   --when......then......
   --when......then......
end;



变量或记录初始化赋值
declare
  --v_sal number(8,2):=0;
  --v_eno number(10);

  type emp_record is record(
       v_sal number(8,2):=0,
       v_eno number(10)
  );
  v_emp_record emp_record;
begin
  select sal,eno into v_emp_record from emp where eno=1;
  --dbms_output.put_line('sal:'||v_sal||','||'eno:'||v_eno);
  dbms_output.put_line('sal:'||v_emp_record.v_sal||','||'eno:'||v_emp_record.v_eno);
--exception

end;



if条件判断
declare
  v_sal emp.sal%type;
begin
  select sal into v_sal from emp where eno=1;
  v_sal:=3000;
  if v_sal>5000
  then
    dbms_output.put_line('中等工资');
  elsif v_sal>4000 and v_sal<=5000
  then
    dbms_output.put_line('工资真低');
  else
    dbms_output.put_line('活不起了');
  end if;
end;


case when条件判断
declare
  v_sal emp.sal%type;
  v_temp varchar2(30);
begin
  select sal into v_sal from emp where eno=1;
  v_sal:=12000;
  v_temp:=
  case
    trunc(v_sal/5000) when 0 then '活不起了'
                      when 1 then '工资真低'
                      when 2 then '中等工资'
  end;
  dbms_output.put_line(v_temp);
end;



while循环
declare
  v_i number(5):=1;
begin
  while v_i <= 100
    loop
        dbms_output.put_line(v_i);
        v_i:=v_i+1;
    end loop;
end;

--输出2-100之间的质数
declare
  v_i number(3):=2;
  v_j number(3):=2;
  v_flag number(1):=1;

begin
  while v_i <=100
    loop
      while v_j<=sqrt(v_i)
        loop
          if
            mod(v_i,v_j)=0 then v_flag:=0;
          end if;
          v_j:=v_j+1;
        end loop;
        if
          v_flag=1 then dbms_output.put_line(v_i);
        end if;
        v_j:=2;
        v_i:=v_i+1;
        v_flag:=1;
   end loop;
end;



for循环

begin
  for i in 1..100
    loop
      dbms_output.put_line(i);
    end loop;
end;




begin
  for i in reverse 1..100
    loop
      dbms_output.put_line(i);
    end loop;
end;


loop循环
declare
  v_i number(5):=1;
begin
  loop
    dbms_output.put_line(v_i);

    v_i:=v_i+1;

  exit when v_i >100;

  end loop;
end;


游标for循环
--游标可以打印出多条记录
declare
  --定义游标
  cursor emp_cursor is select * from emp;
begin
  --for循环会自动进行 打开游标、提取游标、关闭游标
  for i in emp_cursor
  loop
    dbms_output.put_line(i.eno||','||i.ename||','||i.sal||','||i.job||','||i.dept);
  end loop;
end;

--利用游标调整工资员工的工资
declare
  cursor emp_cursor is select ename,sal from emp;
  v_temp number(4,2);
begin

  for i in emp_cursor
  loop
    if i.sal<5000 then v_temp:=0.05;
    elsif i.sal<10000 then v_temp:=0.03;
    elsif i.sal<15000 then v_temp:=0.02;
    else v_temp:=0.01;
    end if;
    dbms_output.put_line(i.sal);
    update emp set sal=sal*(1+v_temp);
  end loop;
end;


游标while循环
--游标可以打印出多条记录
declare
  type emp_record is record(
       v_eno emp.eno%type,
       v_ename emp.ename%type,
       v_sal emp.sal%type,
       v_job emp.job%type,
       v_dept emp.dept%type
  );
  v_emp_record emp_record;
  --定义游标
  cursor emp_cursor is select * from emp;
begin
  --打开游标
  open emp_cursor;
  --提取游标
  fetch emp_cursor into v_emp_record;

  while emp_cursor%found
  loop
    dbms_output.put_line(v_emp_record.v_eno||','||v_emp_record.v_ename||','||v_emp_record.v_sal||','||v_emp_record.v_job||','||v_emp_record.v_dept);
    fetch emp_cursor into v_emp_record;
  end loop;
  --关闭游标
  close emp_cursor;
end;

--利用游标调整工资员工的工资
declare
  cursor emp_cursor is select ename,sal from emp;
  v_temp number(4,2);
  v_ename emp.ename%type;
  v_sal emp.sal%type;
begin
  open emp_cursor;
  fetch emp_cursor into v_ename,v_sal;
  while emp_cursor%found
  loop
    if v_sal<5000 then v_temp:=0.05;
    elsif v_sal<10000 then v_temp:=0.03;
    elsif v_sal<15000 then v_temp:=0.02;
    else v_temp:=0.01;
    end if;
    dbms_output.put_line(v_sal);
    update emp set sal=sal*(1+v_temp);
    fetch emp_cursor into v_ename,v_sal;
  end loop;
end;


隐式游标
--隐式游标
begin
  update emp set sal=sal*(1+0.05) where eno=10;
  if sql%notfound then dbms_output.put_line('查无此人');
  end if;
end;


预定义异常
declare
  v_sal emp.sal%type;
begin
  select sal into v_sal from emp where sal>100;
  dbms_output.put_line(v_sal);
exception
  when too_many_rows then dbms_output.put_line('输出行数太多了');
  when others then dbms_output.put_line('出现其他类型的异常了');
end;


非预定义异常
--非预定义异常
declare
  e_delete_exception exception;
  pragma exception_init(e_delete_exception,-2292);
begin
  delete from emp where eno=100;
exception
  when e_delete_exception then dbms_output.put_line('违反完整性的约束条件,不可删除');
end;


函数
--函数有返回值
--存储过程没有返回值
create or replace function hello
--返回类型
return varchar2
is
   --函数使用过程中,需要声明的变量、记录类型、游标
begin
   return 'hello world';
end;


带参数的函数
--函数有返回值
--存储过程没有返回值
create or replace function hello(v_hname varchar2)
--返回类型
return varchar2
is
   --函数使用过程中,需要声明的变量、记录类型、游标
begin
   return 'hello world'||v_hname;
end;

--计算部门工资和
create or replace function get_sal(d varchar2)
return number
is
  v_sumsal number(10):=0;
  cursor emp_cursor is select sal from emp where dept=d;
begin
  for i in emp_cursor
  loop
    v_sumsal:=v_sumsal+i.sal;
  end loop;
  return v_sumsal;
end;


存储过程
create or replace procedure getsal(dept varchar2,sumsal out number)
is
  cursor sal_cursor is select sal from emp where dept=dept;
begin
  sumsal:=0;
  for i in sal_cursor
  loop
    sumsal:=sumsal+i.sal;
  end loop;
  dbms_output.put_line(sumsal);
end;

/*
declare
  v_sal number(10):=0;
begin
  dbms_output.put_line(getsal('crm',v_sal));
end;
*/

create or replace procedure add_sal(dept varchar2,temp_sal out number)
is
  cursor emp_cursor is select ename,sal from emp where dept=dept;
begin
  temp_sal:=0;
  for i in emp_cursor
  loop
    --更新工资
    update emp set sal=sal*(1+0.05) where ename=i.ename;
    --付出的成本
    temp_sal:=temp_sal+i.sal*0.05;
  end loop;
  dbms_output.put_line(temp_sal);
end;

/*
declare
  v_temp number(10):=0;
begin
  add_sal('crm',v_temp);
end;
*/


触发器
--触发器helloworld
create or replace trigger hello_trigger
after
  update on emp
for each row
begin
  dbms_output.put_line('helloworld');
end;

create or replace trigger del_trigger
before
delete on emp
for each row
begin
  insert into warn values('有数据被删了');
end;



分享到:
评论

相关推荐

    PLSQL学习笔记(1-7)

    本“PLSQL学习笔记”将逐步讲解这些概念,通过实例和练习帮助读者巩固理解,进一步提升在Oracle数据库开发中的技能。无论你是初学者还是有经验的开发者,这份笔记都能提供有价值的参考。通过深入学习和实践,你将...

    Oracle9iSQL/PLSQL学习笔记

    Oracle9i SQL/PLSQL 学习笔记 自己照着书学习时候的笔记。TXT的,比较简单,希望对大家学习有帮助。 其中0 mysqlCmd.txt是我自学mysql时候的笔记,是有关于命令的。大家看看有帮助没有。 都比较精华和简单,适合...

    PLSQL 学习笔记

    【PLSQL学习笔记】 PLSQL(Procedural Language/Structured Query Language)是Oracle数据库系统中的一个强大编程语言,它结合了SQL的查询能力与过程式编程语言的特点,为数据库开发提供了丰富的功能。这篇学习笔记...

    plsql学习笔记整理.docx

    PL/SQL 学习笔记总结 PL/SQL 是 Oracle 在标准 SQL 语言上的扩展,提供了更多的编程功能,例如定义变量和常量、使用条件语句和循环语句、例外处理等。使用 PL/SQL 可以提高开发效率和数据库性能。 PL/SQL 的优点 ...

    sql和plsql学习笔记

    SQL(Structured Query Language)是用于管理和操作关系数据库的标准语言,而...随着经验的积累,开发者可以深入学习高级特性和最佳实践,如性能优化、并发控制、数据库设计等,以提升在Oracle数据库环境下的开发能力。

    Oracle SQL & PLSQL学习笔记

    Oracle SQL 和 PL/SQL 是两种在 Oracle 数据库管理系统中广泛使用的语言,用于管理和操作数据库。SQL,即结构化查询语言,主要分为三个类别:DML...通过不断实践和学习,你可以更高效地管理和维护 Oracle 数据库。

    Java3相关课程系列笔记之三PLSQL学习笔记.doc

    【正文】 本篇笔记主要围绕Java3相关课程中的PL/SQL部分进行深入讲解,由薛海璐老师主讲,全面涵盖了PL/SQL的基础概念、程序结构、...本笔记系列将逐步引导读者掌握这些技能,为Java3课程的学习提供坚实的数据库基础。

    PlSql----甲骨文学习笔记

    PlSql学习笔记 Oracle_PL/SQL是甲骨文数据库管理系统中的一种编程语言,用于创建存储过程、函数、触发器和包等。下面是PlSql学习笔记的详细知识点: 一、创建表 在PlSql中,创建表是最基本的操作。创建表的基本...

    Java相关课程系列笔记

    Java相关课程系列笔记之三PLSQL学习笔记(建议用WPS打开) Java相关课程系列笔记之十JSP学习笔记(建议用WPS打开) Java相关课程系列笔记之十二jQuery学习笔记(建议用WPS打开) Java相关课程系列笔记之十三Struts2...

    oracle plsql编程学习笔记

    ### Oracle PL/SQL编程核心知识点解析 #### 一、创建基本表与操作 在Oracle数据库中,使用PL/SQL进行数据库编程前,首先需掌握如何创建表与进行基本的CRUD(创建、读取、更新、删除)操作。示例中的`CREATE TABLE`...

Global site tag (gtag.js) - Google Analytics