`

oracle存储过程学习

阅读更多
/*set serveroutput on
declare
  type emp_record_type is record(
    name emp.ename%TYPE,
    salary emp.sal%TYPE,
    dno emp.deptno%TYPE
    );
  emp_record emp_record_type;
begin
  select ename,sal,deptno into emp_record --放到记录
  from emp where empno=&no;
  dbms_output.put_line(emp_record.name);
end;*/

--select * from dept;
/*  记录类型
declare
  dept_record dept%ROWTYPE;
begin
dept_record.deptno:=50;
  dept_record.loc:='BEIJING';
  dept_record.dname:='ADMINISTRATOR';
  insert into dept values dept_record;
  dept_record.deptno:=30;
  dept_record.dname:='SALES';
  dept_record.loc:='ShangHai';
  update dept set row=dept_record where deptno=30;
  dept_record.deptno:=50;
  delete from dept where deptno=dept_record.deptno;
 
end;    */   

--索引表       
/*set serveroutput on
declare
    type ename_table_type is table of emp.ename%TYPE  --建立索引表
         index by BINARY_INTEGER;
    ename_table ename_table_type;
begin
  select ename into ename_table(-1) from emp  --下标取行值
  where empno=&no;
  dbms_output.put_line('雇员名:'||ename_table(-1));
end;   */ 
--使用varchar2
/*set serveroutput on
declare
   type area_table_type is table of number
        index by varchar2(10);
   area_table area_table_type;
begin
   area_table('北京'):=1;  --建立索引表
   area_table('上海'):=2;
   area_table('广州'):=3;
   dbms_output.put_line('第一个元素:'||area_table.first);--获取index ,以拼音排序
   dbms_output.put_line('最后一个元素:'||area_table.last);
end;  */                                    
                                         
--嵌套表
/*declare
   type ename_table_type is table of emp.ename%type;
   ename_table ename_table_type;
begin
   ename_table:=ename_table_type('MARY','MARY','MARY');
   select ename into ename_table(2) from emp
   where empno=&no;
   dbms_output.put_line('雇员名1:'||ename_table(1));
   dbms_output.put_line('雇员名2:'||ename_table(2));
   dbms_output.put_line('雇员名3:'||ename_table(3));
end;  */                    

--表列中使用嵌套表
/*create type phone_type is table of varchar2(20);--create type 创建嵌套表,自动生成构造方法
/
create table employee(
       id number(4),
       name varchar2(10),
       sal number(6,2),
       phone phone_type
)nested table phone store as phone_table;    
--指定专门存储表

begin
  insert into employee values(1,'scott',800,phone_type('0471-888888','13400000000'));--使用构造方法
end;*/
--检索嵌套列数据
/*set serveroutput on
declare
    phone_table phone_type;
begin
  select phone into phone_table from employee where id=1;--设置嵌套列变量
  for i in 1..phone_table.count loop
      dbms_output.put_line('电话号码:'||phone_table(i));
  end loop;
end;*/
--更新
/*declare
  phone_table phone_type:=phone_type('010-123456','12322222222');
begin
  update employee set phone=phone_table where id=1;
end;*/

--变长数组 varray
/*declare
  type ename_table_type is varray(20) of emp.ename%type; --设置容量
  ename_table ename_table_type:=ename_table_type('mary');--初始化
begin
  for i in 1..ename_table.count loop
    select ename into ename_table(i) from emp where empno=&no;--更改
  end loop;
  for i in 1..ename_table.count loop
    dbms_output.put_line('雇员名'||i||':'||ename_table(i));
  end loop;
end;*/
--表列中使用 varray
/*create type phone_type is varray(20) of varchar2(20);
/
create table employee(
       id number(4),
       name varchar2(10),
       sal number(6,2),
       phone phone_type
);*/

--pl/sql 记录表 处理多行多列数据
/*declare
  type emp_table_type is table of emp%rowtype  --索引表 多行多列
       index by binary_integer;
   emp_table emp_table_type;
begin
  select * into emp_table(1) from emp
  where empno=&no;
  dbms_output.put_line('雇员姓名:' ||emp_table(1).ename);
  dbms_output.put_line('雇员工资:'||emp_table(1).sal);
end;   */ 

--多级集合 多维数组 嵌套varray
/*declare
  type al_varray_type is varray(10) of int;
  type nal_varray_type is varray(10) of al_varray_type;
  nv  nal_varray_type:=nal_varray_type(
      al_varray_type(58,100,102),
      al_varray_type(55,6,73),
      al_varray_type(2,4));
begin
  dbms_output.put_line('显示元素:');
  for i in 1..nv.count loop
    for j in 1.. nv(i).count loop
      dbms_output.put('nv{'||i||','||j||'}='||nv(i)(j)||' ');
    end loop;
    dbms_output.put_line('');
  end loop;
end;   
/*/
--嵌套表
/*declare
  type al_varray_type is table of int;
  type nal_varray_type is table of al_varray_type;
  nv  nal_varray_type:=nal_varray_type(
      al_varray_type(58,100,102),
      al_varray_type(55,6,73),
      al_varray_type(2,4,6));
begin
  dbms_output.put_line('显示元素:');
  for i in 1..nv.count loop
    for j in 1.. nv(i).count loop
      dbms_output.put('nv{'||i||','||j||'}='||nv(i)(j)||' ');
    end loop;
    dbms_output.put_line('');
  end loop;
end;   
/*/

--多级索引表
/*declare
  type al_varray_type is table of int
       index by binary_integer;
  type nal_varray_type is table of al_varray_type
       index by binary_integer;
  nv  nal_varray_type;
begin
  nv(1)(1):=10;
  nv(1)(2):=20;
  nv(2)(1):=30;
  nv(2)(2):=40;
  dbms_output.put_line('显示元素:');
  for i in 1..nv.count loop
    for j in 1.. nv(i).count loop
      dbms_output.put('nv{'||i||','||j||'}='||nv(i)(j)||' ');
    end loop;
    dbms_output.put_line('');
  end loop;
end;   
/*/

/*declare
  type ename_table_type is table of emp.ename%type;
  ename_table ename_table_type;--:=ename_table_type('kevin','lee'); --索引表无需初始化
begin
  if ename_table.exists(1) then --用于pl/sql
    ename_table(1):='scott';
    dbms_output.put_line('更改后:'||ename_table(1));
  else
    dbms_output.put_line('要初始化表元素');
  end if;
end;
/*/

--批量绑定测试

/*drop table demo;
commit;
create table demo(
       id number(6) primary key,
       name varchar2(10)
       );
commit;      
declare
  type id_table_type is table of demo.id%type
       index by binary_integer;
  type name_table_type is table of demo.name%type
       index by binary_integer;
  id_table id_table_type;
  name_table name_table_type;
  start_time number(10);
  end_time number(10);
 
begin
  for i in 1..50000 loop
    id_table(i):=i;
    name_table(i):='Name'||i; --to_char?
  end loop;
  start_time:=dbms_utility.get_time;
  --for i in 1..id_table.count loop
  forall i in 1..id_table.count    --使用批量绑定特征
    insert into demo values(id_table(i),name_table(i));
  --end loop;
  end_time:=dbms_utility.get_time;
  dbms_output.put_line('总计时间(秒):'||(end_time-start_time)/100);--时间??
  commit;
end;
/*/
/*
create table new_demo as  --空表
select * from demo where 1=0;
commit;

declare
  type id_table_type is table of demo.id%type;
  type name_table_type is table of demo.name%type;
  id_table id_table_type;
  name_table name_table_type;
  type index_pointer_type is table of pls_integer; --创建指针表
  index_pointer index_pointer_type;
begin
  select * bulk collect into id_table,name_table  --??
  from demo;
  index_pointer:=index_pointer_type(6,8,10);
  forall i in values of index_pointer
    insert into new_demo values(id_table(i),name_table(i));
  commit;
end;
/*/

--显示游标
/*declare
  cursor emp_cursor is
    select ename,sal from emp where deptno=10;  --create
  v_ename emp.ename%type;
  v_sal emp.sal%type;
begin
  open emp_cursor;   --open
  loop
    fetch emp_cursor into v_ename,v_sal;    --fetch(loop)
    exit when emp_cursor%NOTFOUND;
    dbms_output.put_line(v_ename||':'||v_sal);
  end loop;
  close emp_cursor; --close
end;
/*/
--显示游标 提取到collect
/*declare
  cursor emp_cursor is
    select ename from emp where deptno=10;  --create
  type ename_table_type is table of emp.ename%type;
  ename_table ename_table_type;
begin
  open emp_cursor;   --open
  fetch emp_cursor bulk collect into ename_table;    --fetch
  for i in 1..ename_table.count loop
    dbms_output.put_line(ename_table(i));
  end loop;
  close emp_cursor; --close
end;
/*/
/*
declare
  type name_array_type is varray(5) of varchar2(10);
  name_array name_array_type;
  cursor emp_cursor is select ename from emp;
  lim int:=5;
  v_count int:=0;
begin
  open emp_cursor;
  loop
    fetch emp_cursor bulk collect into name_array limit lim;
    dbms_output.put('雇员名:');
    for i in 1..(emp_cursor%rowcount-v_count) loop
      dbms_output.put(name_array(i)||'  ');
    end loop;
   
    dbms_output.put_line(to_char(v_count));
    v_count:=emp_cursor%rowcount; --上一次的游标位置
    exit when emp_cursor%notfound;
  end loop;
  close emp_cursor;
end;
/*/
--游标变量  建议  可带参数   当用于 update  delete
/*declare
  cursor emp_cursor(no number) is select ename,sal from emp where deptno=no  --for update 加锁
  for update;
  emp_record emp_cursor%rowtype;
begin
  open emp_cursor(10);
  loop
    fetch emp_cursor into emp_record;
    exit when emp_cursor%notfound; 
    update emp set sal=sal-200 where current of emp_cursor;  --current of 当前行
    dbms_output.put_line('雇员姓名:'||emp_record.ename||',雇员工资:'||emp_record.sal);
  end loop;
  close emp_cursor;
end;
/*/

--使用for语句 简化开发
declare
  cursor emp_cursor(no number) is select ename,sal from emp where deptno=no; 
begin
  for emp_record in emp_cursor(10) loop  --不用声明  也可不用游标 替换为子查询 (select * from emp)
    dbms_output.put_line('第'||emp_cursor%rowcount||'个雇员:'||emp_record.ename);
  end loop;
end;
/
分享到:
评论

相关推荐

    oracle存储过程学习经典入门

    Oracle 存储过程学习经典入门 Oracle 存储过程学习目录是 Oracle 存储过程学习的基础知识,了解 Oracle 存储过程的基本语法、基础知识和一些常见问题的解决方法是非常重要的。本文将从 Oracle 存储过程的基础知识...

    ORACLE存储过程学习

    ### ORACLE存储过程学习知识点详解 #### 一、存储过程概述 存储过程是数据库中预编译好的一组SQL语句,它可以实现复杂的数据处理逻辑,提高应用开发效率,并且能够增强应用程序的安全性。Oracle存储过程使用PL/SQL...

    ORACLE存储过程学习源码

    这个"ORACLE存储过程学习源码"集合包含了从基础到高级的30个示例,是学习和掌握Oracle存储过程的理想资源。下面,我们将深入探讨存储过程的基本概念、结构、类型,以及如何通过这些源码进行学习。 1. **存储过程的...

    oracle存储过程学习经典

    ### Oracle存储过程学习经典 #### Oracle存储过程基础知识与实践 Oracle存储过程是SQL与PL/SQL结合的强大功能,用于封装复杂的数据操作逻辑于数据库内部,从而实现高效的事务处理和数据管理。以下是对Oracle存储...

    oracle存储过程学习经典[语法+实例+调用].doc

    ### Oracle存储过程学习经典知识点详解 #### Oracle存储过程概述与基础知识 存储过程是数据库中预编译的一系列SQL和PL/SQL语句的集合,它提供了执行复杂操作的能力,如事务处理、数据处理和错误处理。Oracle存储...

    oracle存储过程学习经典(实例)

    这个"Oracle存储过程学习经典(实例)"资源显然是为初学者设计的,旨在帮助他们掌握如何创建、执行和管理存储过程。 存储过程在数据库管理中扮演着关键角色,它可以提升系统的性能,通过减少网络流量和提供预编译的...

    oracle 存储过程学习经典

    ### Oracle存储过程学习经典知识点详解 #### 一、Oracle存储过程概述 - **定义**: 存储过程是在数据库中预编译并存储的一段SQL或PL/SQL代码块,它可以包含复杂的逻辑处理,用于实现特定的功能。存储过程提高了代码...

    oracle存储过程学习经典[语法+实例+调用]

    ### Oracle存储过程学习经典知识点详解 #### 一、Oracle存储过程概述 **存储过程**是在数据库中预先定义并编译好的一系列SQL语句或PL/SQL代码块,它可以接受输入参数,输出参数,并能实现复杂的业务逻辑处理。通过...

    Oracle 存储过程学习文档

    ### Oracle存储过程学习文档知识点详解 #### 一、Oracle存储过程概述 **1.1 存储过程定义:** Oracle存储过程是一种存储在数据库中的PL/SQL代码块,它可以接收输入参数并返回输出参数。存储过程能够执行复杂的业务...

    oracle存储过程学习经典[语法+实例+调用].pdf

    ### Oracle存储过程学习经典知识点详解 #### 一、创建存储过程 存储过程是数据库中预编译的一段SQL代码,可以提高程序的可维护性和执行效率。在Oracle中,可以通过`CREATE OR REPLACE PROCEDURE`语句来创建存储过程...

    oracle存储过程学习资料

    在本学习资料中,你将深入理解Oracle存储过程的创建、调用、调试以及优化等多个方面。 1. **存储过程的创建**: Oracle存储过程通过`CREATE PROCEDURE`语句来定义。你可以指定输入参数、输出参数、输入输出参数,...

    oracle 存储过程学习总结

    Oracle存储过程学习总结涵盖了Oracle中存储过程的编写与应用,涉及到字符串处理、游标使用、PL/SQL编程等方面的知识点。 首先,字符串处理是存储过程中常见的操作。文章中提到了多个内置函数,如CONCAT用于连接字符...

    oracle存储过程学习笔记(四)

    在本篇“Oracle存储过程学习笔记(四)”中,我们将深入探讨存储过程的概念、创建、执行以及在实际应用中的优势。 1. **存储过程的概念** 存储过程是一组预先编译的SQL和PL/SQL语句,存储在数据库服务器中。当需要...

    oracle存储过程学习实例文档 创建调用

    在这个“Oracle存储过程学习实例文档”中,我们将深入探讨如何创建存储过程,以及如何在Java应用程序中调用这些过程。 1. **创建Oracle存储过程** 创建存储过程的基本语法如下: ```sql CREATE OR REPLACE ...

    oracle存储过程学习笔记

    1.基本结构 CREATE OR REPLACE PROCEDURE 存储过程名字 ( 参数1 IN NUMBER, 参数2 IN NUMBER ) IS 变量1 INTEGER :=0; 变量2 DATE; BEGIN END 存储过程名字

    oracle存储过程学习经典入门.rar_oracle

    这个压缩包文件"oracle存储过程学习经典入门.rar_oracle"显然包含了帮助初学者理解并掌握Oracle存储过程的基础教程。下面将详细讲解Oracle存储过程的相关知识点。 首先,存储过程是预编译的SQL语句集合,它在数据库...

Global site tag (gtag.js) - Google Analytics