`

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;

 

分享到:
评论

相关推荐

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

    oracle知识点笔记,语法,触发器,存储过程,存储函数,流程控制,游标,异常处理,记录类型,视图,控制用户权限,高级子查询,set运算符,基本的sql_Select语句等等

    Sql Server与Oracle的区别

    要将 Oracle DML 语句和 PL/SQL 程序迁移到 SQL Server 时,请按下列步骤执行: 1. 验证所有 SELECT、INSERT、UPDATE 和 DELETE 语句的语法是有效的。进行任何必要的修改。 2. 把所有外部联接改为 SQL-92 标准外部...

    oracle和SQL的语法区别

    7. 把所有 PL/SQL 游标改为非游标 SELECT 语句或 Transact-SQL 游标。 8. 用 Transact-SQL 过程代替 PL/SQL 过程、函数和包。 9. 把 PL/SQL 触发器转换为 Transact-SQL 触发器。 10. 使用 SET SHOWPLAN 语句,...

    ORACLE和SQL Server的语法区别

    7. 把所有 PL/SQL 游标改为非游标 SELECT 语句或 Transact-SQL 游标。 8. 用 Transact-SQL 过程代替 PL/SQL 过程、函数和包。 9. 把 PL/SQL 触发器转换为 Transact-SQL 触发器。 10. 使用 SET SHOWPLAN 语句,优化...

    Oracle PL-SQL编程详解.pdf

    本⽂⽬录: 1. PL/SQL 程序设计简介 2. PL/SQL块结构和组成元素 3. PL/SQL流程控制语句 4. 把游标说透 5. 异常错误处理 6. 把过程与函数说透 7. 程序包的创建与应⽤ 8. 把触发器说透

    学生成绩管理系统Oracle全部SQL语句.txt

    3、要求使用sqlplus,pl/sql或developer建立存储过程,触发器和程序包等代码,其中要求用到游标,异常,各种语句等对表中数据进行处理; 4、使用自己熟悉的开发语言,加入界面,连接数据库; 5、报告要有操作截图...

    SQL必知必会(第3版-PDF清晰版)part1

    附录C SQL语句的语法...... 167 C.1 ALTER TABLE... 167 C.2 COMMIT... 167 C.3 CREATE INDEX... 168 C.4 CREATE PROCEDURE... 168 C.5 CREATE TABLE... 168 C.6 CREATE VIEW... 168 C.7 DELETE... 169 C.8 DROP......

    oracle常用操作SQL语句

    汇总oracle一些常用SQL语句,比如:用户解锁、修改用户密码、锁表、视图恢复、定时任务、物化视图、触发器、带参游标、常用函数、执行计划、字符串/时间各种运算、HTTP请求、SQL优化等

    Sql语言学习全套-给力推荐

    sql语句.txt trancount.sql Trigger Test.sql trigger transaction.sql T_sql示例.sql UDF在层次型数据处理中的妙用.txt 《SQL 参考手册》中文版.chm 下线数.sql 下线的名字.sql 事务处理及回滚.sql 使用...

    Oracle 11g SQL和PL SQL从入门到精通〖送源代码〗

     除了为读者提供编写SQL语句和开发PL/SQL块的方法外,本书还为应用开发人员提供了一些常用的PL/SQL系统包。通过使用这些PL/SQL系统包,应用开发人员可以开发出功能更强大的数据库应用程序。本书不仅适合SQL和PL/SQL...

    ORACLE__SQL语句教学

    ORACLE__SQL语句教学 引言 3 第一章 数据库基础 6 第二章 Oracle入门 6 第三章 查询基础 11 第四章 单行函数 14 第五章 分组函数 19 第六章 多表查询 21 ... 第十九章 游标、函数 79 第二十章 存储过程 86 ...

    Oracle 11g SQL和PL SQL从入门到精通 pdf格式电子书 下载(一)

     除了为读者提供编写sql语句和开发pl/sql块的方法外,本书还为应用开发人员提供了一些常用的pl/sql系统包。通过使用这些pl/sql系统包,应用开发人员可以开发出功能更强大的数据库应用程序。本书不仅适合sql和pl/sql...

    Oracle 11g SQL和PL SQL从入门到精通 pdf格式电子书 下载(二)

     除了为读者提供编写sql语句和开发pl/sql块的方法外,本书还为应用开发人员提供了一些常用的pl/sql系统包。通过使用这些pl/sql系统包,应用开发人员可以开发出功能更强大的数据库应用程序。本书不仅适合sql和pl/sql...

    Oracle从入门到精通

    2、SQL语句说明:.......................................... 3、数字和日期都可以使用数学运算符建立表达式。............. 4、定义空(NULL)值....................................... 5、别名...................

    Oracle 11g SQL和PL SQL从入门到精通.part1

     除了为读者提供编写sql语句和开发pl/sql块的方法外,本书还为应用开发人员提供了一些常用的pl/sql系统包。通过使用这些pl/sql系统包,应用开发人员可以开发出功能更强大的数据库应用程序。本书不仅适合sql和pl/sql...

    Oracle从基础到熟练(太实用了)

    ①:存储过程 ②:函数 ③:自主事务处理 ④:包规范|包主体 十一.触发器|内置包 ①:触发器类型 ②:触发器原理 ③:new和old 两个行类型变量 ④:递归 ⑤:内置包 十二.导入导出 ①:导入导出/整个DB/表空间/表/...

    Oracle 10g 学习笔记

    │ 经典SQL语句收集(ORACLE).mht │ 融会贯通Oracle数据库的25条基本知识.txt │ 详细讲解Oracle服务器的常用命令行.mht │ └─资料 │ Ora 10G Err_Msg.chm │ Oracle10g_DBA.pdf │ Oracle10G官方文档CHM...

    精通SQL--结构化查询语言详解

    15.5.2 oracle中存储过程和函数的管理 324 第16章 sql触发器 325 16.1 触发器的基本概念 325 16.1.1 触发器简介 325 16.1.2 触发器执行环境 325 16.2 sql server中的触发器 326 16.2.1 sql server触发器的种类...

    精通sql结构化查询语句

    7.6.7 数学运算符与集合运算符的组合应用 7.7 SQL中的表达式 7.7.1 CAST表达式的应用 7.7.2 CASE表达式的应用 7.8 小结第8章 SQL函数 8.1 SQL函数基础 8.1.1 SQL语句函数 8.1.2 常用的SQL语句函数 8.2 日期函数和...

Global site tag (gtag.js) - Google Analytics