`

oracle-常用sql语句、游标、触发器、存储过程、函数、包......

阅读更多

一、常用sql语句

聚合函数
COUNT(*)计算元组个数
COUNT(列名)对一列中的值计算个数
SUM(列名)求某一列值的总合
AVG(列名)求某一列值的平均值
MAX(列名)
MIN(列名)

--按照本门号从高到底,工资从高到底查询员工表
select * from personnel order by section desc,sal desc;

--求各个部门工资的平均值
select s.name, avg(p.sal)
  from personnel p
 inner join section s
    on p.section = s.id
 group by s.name
 
 --求各个部门工资的和
select s.name, sum(p.sal)
  from personnel p
 inner join section s
    on p.section = s.id
 group by s.name

--求工资大于财务部平均工资的员工的信息
select *
  from personnel
 where sal > (select avg(sal)
                from personnel
               where section = (select id from section where name = '财务部'))
 
--查询寻所有部门4的工作岗位,在根据工作岗位查询所有在这些工作呢岗位工作呢的员工            
select p.name,p.sal,j.name, s.name
  from personnel p
 inner join job j
    on p.job = j.id
 inner join section s
    on p.section = s.id
 where p.job in (select job from personnel where section = 4 group by job)
 


--各部门工资大于部门平均工资的员工信息
select *
  from personnel p
 where sal > (select avg(sal) from personnel where p.section = section);

--各部门工资大于部门平均工资的员工数量和部门编号
select count(*),p.section
  from personnel p
 where sal > (select avg(sal) from personnel where p.section = section) group by p.section;

 --排序
 select * from personnel order by id desc
 
 --插入
 insert into section (id,name) values(5,'市场部');
 
 --删
 delete section where id = 5;
 
 --改
 update section set name = '尼玛' where id = 5;

 --分页
select *
  from (select e1.*, rownum r
          from (select * from employee) e1
         where rownum < 5)
 where r > 2

--别名
select s.name as "部门",avg(sal) as "平均工资"
  from personnel p
 inner join section s
    on p.section = s.id
 group by s.name


--建表
create table text(
   id number(6) primary key,
   name varchar2(20) not null,
   age number(6) not null,
   manager number(6)
)tablespace users;

--插入数据
insert into text (id,name,age,manager) values (106,'A',30,104);
insert into text (id,name,age,manager) values (109,'B',19,104);
insert into text (id,name,age,manager) values (104,'A',20,111);
insert into text (id,name,age,manager) values (107,'D',35,109);
insert into text (id,name,age,manager) values (112,'E',25,120);
insert into text (id,name,age,manager) values (119,'F',45,null);




//选修了java课程的学生的id和姓名
select s.studentid, s.name
  from student s
 inner join sc x
    on s.studentid = x.studentid
 where x.courseid = (select courseid from course where coursename = 'Java');

--查看熊敏选修了那几门课程
select c.coursename
  from course c
 inner join sc x
    on c.courseid = x.courseid
 where x.studentid = (select studentid from student where name = '熊敏');

--打印选课数大于3的学生的id和姓名
select stu.studentid, stu.name
  from student stu
 where (select count(*) from sc where studentid = stu.studentid) > 3;

--:列出所有年龄比所属主管年龄大的人的ID 和名字?
select em.id,em.name from text em where em.age > (select age from text where em.manager = id);

--删除相同数据
delete from text t where t.id > (select min(x.id) from text x where t.name = x.name);



--用exists代替in
select * from employee e where e.section in (select id from section) order by id;

select * from employee e where exists (select id from section s where e.section = s.id) order by id;


--exists与in比较
select * from 表A where exists(select * from 表B where 表B.id=表A.id)  
--这句相当于 
select * from 表A where id in (select id from 表B)

 

二、游标、触发器、存储过程、函数、包......

打开输出选项 set serveroutput on;
关闭输出选项 set serveroutput off;

一、游标的应用

实例1:
declare
  id number;--申明变量接受游标里查出来的值
  department varchar2(20);
  --申明一个游标:aaaa
  cursor aaaa is select studentid,name from student where name  = '熊敏';
begin
  --打开游标
  open aaaa;
  --判断是否返回记录
  if aaaa%notfound then
    dbms_output.put_line('没有找到相应的记录');
  else
    --从游标中读取数据
    fetch aaaa
      into id,department;
    dbms_output.put_line(id || ',' || department);
  end if;
  close aaaa;
end;

实例2:
--游标循环读取数据
declare --申明  
    id   number; --变量
    name varchar2(20);
 cursor user_table is select studentid,name from student; --申明游标:user_table
begin  --开始
  for user_tables in user_table loop  --循环读取,user_tables为临时变量
    id   := user_tables.studentid;
    name := user_tables.name;
    dbms_output.put_line('学员编号:' || id || '学员姓名:' || name);
  end loop;
end; --结束

二、创建和调用过程
	--无参过程pro_01
	create or replace procedure pro_01 is
begin
  insert into job (id,name) values (4,'总经理');
  end;
 
--调用过程(在命令行中调)
	exec pro_01;

--有参过程pro_02
create  or replace procedure pro_02 
 ----申明五个个输入参数,
----输入字符串不让加长度
 (
       student_id in number,
       student_name in varchar2,
       student_sex in varchar2,
       student_age in number,
       student_department in varchar2
 ) as 
 begin
   insert into student values(student_id,student_name,student_sex,student_age,student_department);
   end;

--调用
exec pro_02(7,'林文伟','男',23,'学习部');
三、函数
--创建一个返回插入条数信息的函数
--申明5个参数的函数
--函数名function_insert_student
--返回值run_number
create or replace function function_insert_student
(
    student in number,
    stu_name in varchar2,
    sex in varchar2,
    age in number,
    department in varchar2
)return number as ret_number number :=0;
begin
  insert into student values(student,stu_name,sex,age,department);
  ret_number := ret_number + 1;
  commit;
  return ret_number;
  end;
--调用函数
  declare 
  --申明一个变量接受函数返回值
  receive_number number;
  begin
    receive_number :=function_insert_student(9,'王正国','男',23,'学习部');
    dbms_output.put_line('一共插入--' || receive_number || '条数据。');
end;

四、包

--创建包头
    create or replace package pack_age as
      --申明过程
      procedure my_procedure(studentid	number,stu_name varchar2,sex varchar2,age number,department varchar2);
      --申明函数
      function my_function(studentid number,stu_name varchar2,sex varchar2,age number,department varchar2) return number;
    end pack_age;
    
    --创建包体
    create or replace package body pack_age as
      --实现过程
      procedure my_procedure(studentid number,stu_name varchar2,sex varchar2,age number,department varchar2) is
        begin
          insert into student values (studentid,stu_name,sex,age,department);
          commit;
        end my_procedure;
     --函数的实现
     function my_function(studentid in number,stu_name in varchar2,sex in varchar2,age in number,department in varchar2)
       return number as return_number number := 0;
       begin
         insert into student values (studentid,stu_name,sex,age,department);
         return_number := return_number + 1;
         commit;
         return return_number;
         end my_function;
    end pack_age;
    
    --包的调用
    declare 
      --申明变量接收函数的返回值
      num_number number;
      begin
          pack_age.my_procedure(10,'黄广','男',23,'学习部');
          num_number := pack_age.my_function(11,'黄云生','男',23,'学习部');
        end;

五、视图

--创建视图
     create or replace view my_view as
     select * from student;
    
     --调用视图
     select * from my_view;

六、触发器

1、测试表结构
  create table a(
    id number(6),
    s_name varchar2(30)
)

create table b(
   id number(6),
s_name varchar2(30)
)

2、--创建出发器-- bck_trg
--单向表a插入数据的时候同时向表b里插入数据
--insert into b values (1,'熊敏')

  create or replace trigger bck_trg
  after insert on a for each row
begin
       insert into b values (1,'熊敏');
end;

--测试
insert into a values(1,'熊敏');



--复制表数据的写法
create or replace trigger tig_test
  after insert on a  
declare
begin
   insert into b (select * from a where a.id=(select max(a.id) from a ));
end tig_test;


--将插入的信息插入到目标表
create or replace trigger tig_a
  after insert on a  
  for each row
declare
  -- 在这里申明变量
begin
   insert into b(id,s_name) values(:NEW.ID,:NEW.S_NAME);
end tig_a;

--将A表删除的数据插入到B表
create or replace trigger tig_a
  after delete on a  
  for each row
declare
  -- local variables here
begin
   insert into b(id,s_name) values(:old.ID,:old.S_NAME);
end tig_a;

 

分享到:
评论

相关推荐

    1-oracle培训整套教程(存储过程-函数-触发器,异常处理,游标.存储包)

    本套教程全面覆盖了Oracle数据库的核心编程元素,包括存储过程、函数、触发器、异常处理、游标和存储包,这些都是数据库开发和管理中的关键概念。 首先,我们来详细了解存储过程。存储过程是一组预编译的SQL语句,...

    oracle函数触发器游标等几个小例子

    Oracle数据库是世界上最流行的数据库管理系统之一,它提供了丰富的功能来处理数据,包括函数、游标和触发器。在本文中,我们将深入探讨这些概念,并通过一些实际的例子来理解它们的用法。 1. **Oracle函数**:函数...

    oracle笔记(存储过程函数触发器游标流程控制等)

    1. **存储过程与函数**:存储过程是预编译的SQL语句集合,用于执行特定任务。它们可以提高性能,减少网络流量,并提供模块化编程。函数则是返回值的存储过程,可以在SQL查询中直接使用。理解并熟练创建、调用和管理...

    Oracle教案 Oracle 存储过程 游标 SQL语句 PL/SQL

    Oracle 教案:深入理解 Oracle 存储过程、游标与 SQL 语句及 PL/SQL Oracle 是全球领先的数据库管理系统提供商,不仅提供数据库产品,还包括中间件、云计算服务等全面的企业级解决方案。"Oracle"一词源于古希腊神话...

    Oracle触发器与存储过程高级编程-第3版itpub.rar

    其次,存储过程(Stored Procedures)是一组为了完成特定功能的SQL语句集合,存储在数据库中并可由应用程序调用执行。它们提供了一种封装和重用SQL代码的方式,增强了代码的安全性,减少了网络通信量,提高了数据库...

    oracle常用sql语句大全 注释完整 放心使用

    本资料集包含了Oracle数据库中常用SQL语句的大全,注释完整,非常适合初学者和有经验的开发者参考使用。 1. **数据查询(SELECT语句)**: - `SELECT * FROM table_name;`:查询表table_name中的所有列。 - `...

    Oracle常用sql语句整理.zip

    以下是一些Oracle数据库中常用的SQL语句及其详细解释。 1. **数据查询(SELECT)** - `SELECT column1, column2 FROM table_name;` 用于从表中选择特定列的数据。 - `WHERE condition;` 添加条件过滤结果,如 `...

    Oracle PL-SQL编程 创建存储过程、函数、触发器等

    ### Oracle PL/SQL编程 创建存储过程、函数、触发器等 #### 一、PL/SQL 概念回顾 PL/SQL(Procedural Language for SQL)是Oracle数据库中的一种过程化语言,它结合了SQL的强大数据操作能力和传统过程化语言的控制...

    Oracle PL-SQL编程详解.pdf

    PL/SQL还支持多种SQL语句,如DML(数据操纵语言)的INSERT、UPDATE、DELETE、SELECT INTO,以及事务控制语句COMMIT、ROLLBACK和SAVEPOINT。不过,DDL(数据定义语言)如CREATE TABLE等需要以动态SQL的方式在PL/SQL中...

    PLSQL 文档集合包(语法 异常 指针 游标 存储过程...)

    PLSQL,全称为Procedural Language/Structured Query Language,是Oracle数据库系统中用于编写存储过程、函数、包等数据库程序的编程语言。本压缩包集合了关于PLSQL的各种关键知识点,包括语法、异常处理、指针和...

    Oracle-Pl-Sql.rar

    4. **存储过程和函数**:存储过程是一组预编译的PL/SQL语句,可以在需要时调用。函数类似于存储过程,但必须返回一个值。了解如何创建、调用和管理这些对象是提高数据库性能的重要方法。 5. **包(PACKAGE)**:包...

    oracle常用SQL语句(汇总版).zip

    本文件"oracle常用SQL语句(汇总版)"将对Oracle中的常用SQL语法进行详尽阐述。 1. 数据查询: - `SELECT`语句:这是SQL中最基本的查询语句,用于从表中检索数据。例如,`SELECT * FROM 表名;`将返回表中的所有记录...

    oracle pl/sql 存储过程和函数与触发器

    在Oracle中,可以使用`EXECUTE`语句来调用存储过程和函数,也可以在SQL语句中直接嵌入函数。参数传递给这些程序单元,可以是IN(输入)、OUT(输出)或IN OUT(输入输出)类型。 六、游标和循环 游标是PL/SQL中处理...

    PLSQL操作存储过程、函数、游标、触发器、定时任务等实例SQL脚本.zip

    1. **存储过程**:存储过程是一组预编译的SQL语句,它们封装在一起,可以作为一个单元进行调用。在Oracle中,创建存储过程可以提高性能,减少网络流量,并提高代码的安全性。通过存储过程,开发者可以实现复杂的业务...

    ORACLE增删改查,游标,包,过程,触发器

    - 包是PL/SQL中组织和管理相关程序单元(如过程、函数、变量)的一种方式。它包括包规范(声明部分)和包主体(实现部分)。包能提供更好的模块化、封装和重用性,也有助于提升性能,因为包内的对象可以被编译一次...

    Oracle游标使用案例大全

    通过学习这些案例,你可以了解如何在实际应用中灵活运用Oracle游标,包括在存储过程、触发器等高级功能中。案例中的7-游标使用很可能是对各种游标操作的具体示例,如打开、关闭、提取数据、循环处理等,有助于加深...

    oracle 的函数、存储过程、游标、简单实例

    其次,**存储过程**是包含一系列SQL语句和PL/SQL代码的可重用模块。它们可以有输入和输出参数,甚至可以返回结果集。存储过程有助于提高性能,因为它们可以在服务器端编译并缓存,减少网络通信。例如,你可以创建一...

    OraclePL-SQL.rar_ORACLE PL_oracle_oracle sql

    Oracle PL/SQL是Oracle数据库系统中的重要组成部分,用于开发存储过程、函数、触发器等数据库对象,以及执行复杂的SQL操作。以下是对Oracle PL/SQL及其相关知识点的详细说明: 1. **Oracle数据库基础**:Oracle...

    Oracle PL-SQL语言教程(简体中文pdf版

    3. **过程**:过程是一组PL-SQL语句,不返回值但可以有参数。常用于封装业务逻辑。 三、游标和记录 1. **游标**:游标允许你逐行处理查询结果集,是PL-SQL处理大量数据的重要工具。 2. **记录**:PL-SQL中的记录...

    oracle触发器与存储过程高级编程

    4. **包(Packages)**:包是存储过程和函数的集合,可以包含公共变量、常量和类型定义,提供了更高级的代码组织和封装。 5. **索引优化**:合理创建和使用索引可以显著提升触发器和存储过程的执行效率,但过多的...

Global site tag (gtag.js) - Google Analytics