Oracle笔记之存储过程经典案例

概述
本篇博文中主要探讨以下内容:

  1. 记录变量(record复合数据类型)
  2. sql 属性(SQL%FOUND、SQL%NOTFOUND、SQL%ROWCOUNT)
  3. 输入一个部门号,按不同的部门进行加薪
  4. 一次取多个值用select into
  5. 取出全部列

1. 记录变量

record:
定义记录数据类型,将几个相关的、分离的、基本数据类型的变量组成一个整体的方法,即RECORD复合数据类型。

在使用记录类型变量时,需要在声明部分先声明记录的组成,记录的变量,然后在执行部分引用该记录变量本身或者其中的成员。

--记录变量
declare 
       type emp_record_type is record(v_name emp.ename%type,v_sal emp.sal%type);
       emp_record emp_record_type;
begin
       select ename ,sal into emp_record from emp where empno=&no;
       dbms_output.put_line('name: ' || emp_record.v_name || '  sal: ' || emp_record.v_sal);
end;


declare 
  emp_record emp%ROWTYPE;
begin
  select * into emp_record from emp where empno = &no;
  dbms_output.put_line('name:  ' || emp_record.ename || ' sal: ' || emp_record.sal);
exception 
  when NO_DATA_FOUND then
     dbms_output.put_line('找不到此人');  
  when others then
    null;
end;  

2.sql 属性

--sql 属性
--SQL%FOUND和SQL%NOTFOUND
begin
   update t set sal= &sal where empno= &no;
   if SQL%FOUND then
     dbms_output.put_line('更新完成');
   else
     dbms_output.put_line('没有找到数据');
   end if;
end;  


--为什么没有显示汉字信息?
declare
     v_sal number;
begin
     select sal into v_sal from emp where empno = 743;
     if (SQL%FOUND) then
        dbms_output.put_line('sal = ' || v_sal);
     else
        dbms_output.put_line('找不到此编号');
     end if;
end;

ORA-01403: no data found
ORA-06512: at line 4


SQL%NOTFOUND 与上面相反



--返回作用的计数:SQL%ROWCOUNT

begin
  update t set sal = 1 ;
  dbms_output.put_line('has updated ' || SQL%ROWCOUNT || ' rows');
end;

3. 输入一个部门号,按不同的部门进行加薪


--输入一个部门号,按不同的部门进行加薪
declare
  v_deptno emp.deptno%type;
begin
  v_deptno := &no;
  case v_deptno
    when 10 then
      update emp set comm = 100 where deptno = v_deptno;
    when 20 then
      update emp set comm = 80 where deptno = v_deptno;
    when 30 then
      update emp set comm = 50 where deptno = v_deptno;
    else
      dbms_output.put_line('不存此部门');
  end case;
end;  

4. 一次取多个值用select into

--一次取多个值用select into 
declare
    type emp_table_type is table of emp.ename%type index by binary_integer;
    emp_table emp_table_type;
begin
    select ename bulk collect into emp_table from emp;
    for i in 1..emp_table.count loop
      dbms_output.put_line(emp_table(i));
    end loop;
end;  


declare
    type emp_table_type is table of emp.ename%type;
    emp_table emp_table_type;
begin
    select ename bulk collect into emp_table from emp;
    for i in 1..emp_table.count loop
      dbms_output.put_line(emp_table(i));
    end loop;
end;  

5. 取出全部列

--取出全部列
declare
    type emp_table_type  is table of emp%rowtype;
    emp_table emp_table_type;
begin
    select * bulk collect into emp_table from emp;
    for i in 1..emp_table.count loop
       dbms_output.put_line('name: ' || emp_table(i).ename || '  sal: ' || emp_table(i).sal);
    end loop;
end;

posted on   JAVA开发区  阅读(14)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示