`
lan13217
  • 浏览: 502261 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Oracle学习笔记 (函数,视图,索引,存储过程)

阅读更多
当前用户创建了那些表,视图等。这个表叫做用户字典表
select table_name from user_tables;
select view_name from user_views;
select constraint_name,table_name from user_constraint;

declare 块用于声明变量
declare
v_name varchar2(20) :='zhoujian'; --变量默认v_开头
begin
v_name :='myName'; --赋值
dbms_output.put_line(v_name);
end


declare
v_name number:=0;
begin
v_num:=2/v_num;
dbms_output.put_line(v_num);
exception     --异常处理
when others then   --还有其他异常,则处理
  dbms_output.put_line('error');
end;
/

-------------------复合变量---------------------
table--相当于JAVA里面的数组
RECORD--相当于JAVA里面的类

table--

declare
  类型名称      下标类型
type type_table_emp_empno is table of emp.empno%type index by binary_integer;
  v_empnos type_table_emp_empno;
begin
v_empnos(0):=7369;
  v_empnos(2):=7839;
  v_empnos(-1):=0000;
  dbms_output.put_line(v_empnos(-1));
end;

RECORD--

declare
type type_record_dept is record
(
  deptno dept.deptno%type,
  dname dept.dname%type,
  loc dept.loc%type
);
v_temp type_record_dept;
begin
v_temp.deptno:=50;
  v_temp.dname :='aaaa';
  v_temp.loc:='bj';
  dbms_output.put_line(v_temp.deptno ||' '|| v_temp.dname);
end;

-- 使用%rowtype 声明record变量
declare
v_temp dept%rowtype;
begin
v_temp.deptno :=50;
  v_temp.dname :='aaaa';
  v_temp.loc:='bj';
  dbms_output.put_line(v_temp.deptno ||' '|| v_temp.dname);
end;


--------------------------------------------------
// 特定行类型,与该行的类型结构相同

declare
v_emp emp%rowtype;
begin
select * into v_emp from emp where empno=7369;
dbms_output.put_line(v_emp.ename);
end;
/

----------此段代码更新并且输出影响的行数---------
  1  declare
  2     v_deptno emp2.deptno%type:=20;
  3     v_count number;
  4  begin update emp2 set sal=sal/2 where deptno=v_deptno;
  5     -- 输出上一条SQL语句影响的行数
  6     dbms_output.put_line(sql%rowcount||'条记录被影响');
  7     commit;
  8* end;
SQL> /


begin
-- 立即,马上执行''内的SQL语句
-- 如遇单引号里仍有单引号,则两个单引号代表一个单引号。
execute immediate 'create table T(nnn varchar2(20) default ''aaa'')';
end

--------------------------------------------------

--------------------判断语句---------------------
// 判断语句的书写
declare
v_sal emp.sal%type;
begin
select sal into v_sal from emp where empno=7369;
if(v_sal<1200) then
  dbms_output.put_line('low');

-- 注意此处否则如果语法与一般程序语法不同
elsif(v_sal<2000) then
  dbms_output.put_line('middle');
else
  dbms_output.put_line('hight');
end if;
end;
/


--------------------------------------------------

--------------ORACLE里的循环--------------------

// ORACLE里的循环
-- 第一种(似DO WHILE)
declare
-- 二进制变量,默认为1
i binary_integer :=1;
begin
-- 循环开始
loop
  dbms_output.put_line(i);
  -- 变量自加
  i:=i+1;
  -- 在此条件下退出循环
  exit when (i>=11);
-- 循环结束
end loop;
end;

-- 第二种(似WHILE)
declare
j binary_integer:=1;
begin
// 条件  开始
while(j<11) loop
  dbms_output.put_line(j);
   j:=j+1;
end loop;
end;

-- 第三种(FOR)
begin
for k in 1..10 loop
  dbms_output.put_line(k);
end loop;
-- 反向输出
for k in reverse 1..99 loop
  dbms_output.put_line(k);
end loop;
end;


--------------------------------------------------


---------------异常处理--------------------
declare
v_temp number(4);
begin
-- select empno into v_temp from emp where deptno=10;
select empno into v_temp from emp where deptno=213;
exception
when too_many_rows then
  dbms_output.put_line('太多记录了');
when no_data_found then
  dbms_output.put_line('没有该数据');
when others then
  dbms_output.put_line('error');
end;
/

-- ORACLE数据库DBA使用一个表来记录数据库里的相应错误
create table errorlog
(
id number primary key,
errcode number,
errmsg varchar2(1024),
errdate date
)
/
-- 创建一个序列
create sequence seq_errorlog_id start with 1 increment by 1

-- 程序执行时
  1  declare
  2     v_deptno dept.deptno%type:=10;
  3     v_errcode number;
  4     v_errmsg varchar2(1024);
  5  begin
  6     delete from dept where deptno=v_deptno;
  7     commit;
  8  exception
  9     when others then
  -- 回撤已经执行的SQL
10             rollback;
   -- 将错误值赋予给相应变量
11                     v_errcode:=SQLCODE;
12                     v_errmsg:=SQLERRM;
  -- 将错误变量插入到错误记录表
13             insert into errorlog values(seq_errorlog_id.nextval,v_errcode,v_errmsg,sysdate);
14             commit;
15* end;

-- 具体出错时间
select to_char(errdate,'yyyy-mm-dd hh24:mi:ss') from errorlog
/


--------------------------------------------------

--------------------------------------------------

// 数据字典表
desc dictionary;

PLSQL
ORACLE内部的编程语言

PL是为了补充SQL语言的。SQL语言只有SDUI
过程,语言

输出HelloWorld
begin
dbms_output.put_line('HelloWorld');
end;
/

--------------------存储过程------------------------
1.创建存储过程
  S P

// 设置显示输出
set serveroutput on;

// 创建一个存储过程
create or replace procedure test
is
v_sal number;
begin
select sal into v_sal from emp where empno=7900;
dbms_output.put_line(v_sal);
end test;

// 执行
exec test;

begin
test;
end;
/

-- 带参
create or replace procedure p
-- in 传入 out 传出
(v_a in number,v_b number,v_ret out number, v_temp in out number)
is
begin
if(v_a>v_b) then
  v_ret:=v_a;
else
  v_ret:=v_b;
end if;
v_temp:=v_temp+1;
end;
/

-- 调用
declare
v_a number:=3;
v_b number:=4;
v_ret number;
v_temp number:=5;
begin
p(v_a,v_b,v_ret,v_temp);
dbms_output.put_line(v_ret);
dbms_output.put_line(v_temp);
end;
/



// 删除
drop procedure test;

----------------------------------------------------

----------------------视图--------------------------

// 创建
create or replace view 视图名称 as 子查询
with check option --加此将不能修改条件列
with read only  --整个视图都是只读的

// 视图是一个虚拟表

// 删除
drop view test;

----------------------------------------------------

----------------------函数--------------------------
create or replace function 函数名 is
v_sal number;
begin
select * from emp;
end;

-- 带返回值的函数
  1  create or replace function sal_tax
  2     (v_sal number)
  3     return number
  4  is
  5  begin
  6     if(v_sal<2000)then
  7             return 0.10;
  8     elsif(v_sal<2750)then
  9             return 0.15;
10     else
11             return 0.20;
12     end if;
13* end;
SQL> /

dr

// 调用函数
select 函数名(参数名)from dual;

// 删除函数
drop function sal_tax;

----------------------------------------------------
---------------------游标---------------------------
-- do while循环
declare
-- 申明一个游标
cursor c is
  select * from emp;
v_emp c%rowtype;
begin
-- 打开游标(此时才取出数据)
open c;
-- 循环游标(do while)
loop
  fetch c into v_emp;
   -- 如果没有找到返回记录
   exit when (c%notfound);
   dbms_output.put_line(v_emp.ename);
end loop;
close c;
end;
-- rowcount 返回记录数 found找到的记录数 notfound

-- while 循环
declare
-- 申明一个游标
cursor c is
  select * from emp;
v_emp c%rowtype;
begin
-- 打开游标(此时才取出数据)
open c;
fetch c into v_emp;
while (c%found) loop
  dbms_output.put_line(v_emp.ename);
  fetch c into v_emp;
end loop;
close c;
end;

-- for循环
declare
cursor c is
  select * from emp;
begin
-- 自动申明,自动打开关闭。自动fetch,自动放入v_emp
for v_emp in c loop
  dbms_output.put_line(v_emp.ename);
end loop;
end;

-- 带参数的游标
declare
  -- 形参
cursor c(v_deptno emp.deptno%type,v_job emp.job%type)
is
  select ename,sal from emp where deptno=v_deptno and job =v_job;
-- 不需要申明
--v_temp c%rowtype;
begin
for v_temp in c(30,'CLERK') loop
  dbms_output.put_line(v_emp.ename);
end loop;
end; 

-- 可更新的游标
declare
cursor c
is
  select * from emp2 for update;
begin
for v_temp in c loop
  if(v_temp.sal<2000)then
   -- 更新当前这条记录
   update emp2 set sal=sal*2 where current of c;
  elsif (v_temp.sal=5000) then
   delete from emp2 where current of c;
  end if;
end loop;
commit;
end;

----------------------------------------------------
---------------------触发器------------------------
--触发器不能直接执行,它必须依附在某张表上面
--创建一张表(记录表)
SQL> create table emp2_log
  2  (
  3  uname varchar2(20),
  4  action varchar2(10),
  5  atime date
  6  );

-- 创建触发器
create or replace trigger trig
-- 此处代表此触发器出发的条件,其中after可以用BEFORE替代。
-- 此处如果不写FOR EACH ROW 则执行多次时只触发一次,写了之后,执行一条则触发一次。
after insert or delete or update on emp2 for each row
begin
if inserting then
  insert into emp2_log values (user,'insert',sysdate);
elsif updating then
  insert into emp2_log values (user,'update',sysdate);
elsif deleting then
  insert into emp2_log values (user,'update',sysdate);
end if;
end;
/

-- 删除触发器
drop trigger trig
/

-- 触发时更新关联表
-- 先触发,后约束
create or replace trigger trig
after update on dept
for each row
begin
--   新值   旧值
update emp set deptno=:new.deptno where deptno=:old.deptno;
end;
/


----------------------------------------------------
--------------树状结构的存储和展示------------------

--
create table article(
id number primary key,
cont varchar2(4000),
pid number,
isleaf number(1), --0代表非叶子节点,1代表叶子节点
alevel number(2)
);

insert into article values(1,'蚂蚁大战大象',0,0,0);
insert into article values(2,'大象被打趴下了',1,0,1);
insert into article values(3,'蚂蚁也不好过',2,1,2);
insert into article values(4,'瞎说',2,0,2);
insert into article values(5,'没有瞎说',4,1,3);
insert into article values(6,'怎么可能',1,0,1);
insert into article values(7,'怎么没有可能',6,1,2);
insert into article values(8,'可能性是很大的',6,1,2);
insert into article values(9,'大象进医院了',2,0,2);
insert into article values(10,'护士是蚂蚁',9,1,3);
commit;

-- 递归调用
create or replace procedure p(v_pid article.pid%type,v_level binary_integer) is
cursor c is select * from article where pid=v_pid;
v_preStr varchar2(1024):=' ';
begin
for i in 1..v_level loop
  v_preStr:=v_preStr||'****';
end loop;
for v_article in c loop
  dbms_output.put_line(v_article.cont);
  if(v_article.isleaf=0)then
   p(v_article.id,v_level+1);
  end if;
end loop;
end;
/


----------------------------------------------------

分享到:
评论

相关推荐

    oracle学习笔记(从入门到精通)

    压缩包主要包括15个文档,主要是本人...07-视图和索引学习笔记.txt 08-PLSQL和游标结合学习笔记.txt 09-游标学习笔记.txt 10-重要的函数的学习笔记.txt 11-存储过程学习笔记.txt 12-触发器学习笔记.txt 13-pl编码.txt

    oracle学习笔记整理

    以下是对Oracle学习笔记整理的主要知识点的详细说明: 1. **数据库选择**: 在决定使用哪种数据库时,通常需要考虑项目的规模、性能需求、安全性要求以及可用资源。Oracle数据库因其稳定性、可扩展性和高性能而被...

    MSDN oracle学习笔记

    在“MSDN Oracle学习笔记”中,我们可以期待找到关于Oracle数据库的详细讲解和实践指导。 首先,Oracle数据库的基础知识是必不可少的。这通常涵盖数据库系统的基本概念,如SQL(结构化查询语言)的使用,数据类型,...

    mldn oracle学习笔记

    "mldn oracle学习笔记"是一份关于学习Oracle数据库的资源,很可能包含了从基础到高级的全方位教程,旨在帮助学习者深入理解Oracle数据库的原理和操作技巧。"魔乐"可能是这份笔记的作者或者是一个学习社区的名字,而...

    Oracle 10g 学习笔记

    │ Oracle学习笔记.pdf │ Oracle学习笔记.wps │ 安装Oracle后myEclipse不能正常使用.txt │ 手工配置listener.ora【避免出现ORA-12514错误】.txt │ 贴子树状态存储结构.jpg │ 贴子树状态存储结构.sql │ ├─01...

    MLDN_Oracle学习笔记+源码 李兴华讲解

    《MLDN_Oracle学习笔记+源码 李兴华讲解》是针对Oracle数据库系统的一份详尽学习资源,由知名讲师李兴华精心编撰。这份资料不仅包含了丰富的理论知识,还提供了源代码实例,旨在帮助学习者深入理解和掌握Oracle...

    oracle学习笔记,介绍详细

    这份“Oracle学习笔记”无疑是你深入理解和掌握Oracle技术的重要资源。笔记涵盖了Oracle的语法基础、核心概念以及各种实用功能,旨在帮助初学者快速上手,同时也能为有一定经验的DBA提供参考。 首先,Oracle数据库...

    oracle学习笔记.rar

    这份"oracle学习笔记.rar"压缩包包含了作者在学习Oracle过程中整理的基础知识,对于初学者来说是一份宝贵的资料。 1. **Oracle数据库系统概述**:Oracle数据库是关系型数据库管理系统(RDBMS),由美国Oracle公司...

    oracle学习笔记

    Oracle学习笔记涵盖了数据库管理的基础知识,特别是关于Oracle数据库的索引创建、系统权限和对象权限的理解,以及表空间的管理。首先,我们来看看索引的创建及其特性。 在Oracle中,索引是一种加速数据检索的结构。...

    李兴华Oracle全部笔记

    其次,笔记可能会深入到Oracle的高级特性,比如PL/SQL编程,这是一种专为Oracle设计的过程化编程语言,用于创建存储过程、函数、触发器等。此外,可能还会涵盖数据库事务处理、并发控制和锁机制,这些都是保证数据...

    Oracle 超强学习笔记

    Oracle数据库包含多种对象,如表、视图、索引、序列、同义词、存储过程和触发器等。理解这些对象的创建、修改和删除操作是数据库管理的重要部分。 6. **数据库安全** Oracle提供了精细的权限和角色机制,通过...

    ORACLE学习笔记.doc

    随着学习的深入,还将涉及索引、视图、触发器、存储过程、游标、并行处理、分区、性能优化等多个方面。理解并熟练掌握这些概念和技能,对于成为一名合格的Oracle数据库管理员或开发人员至关重要。

    oracle学习笔记.docx

    这篇学习笔记将探讨Oracle的一些核心概念和关键特性,帮助你更好地理解和掌握这个强大的数据库系统。 一、Oracle数据库概述 Oracle数据库是一种多用户、支持SQL的、支持网络环境的数据库管理系统。它由Oracle公司...

    韩顺平2011oracle学习笔记

    【Oracle的基础使用与基本命令】 ...以上只是Oracle学习笔记的一部分,实际学习中还包括索引、视图、存储过程、触发器、游标、事务控制等多个方面的内容,都需要深入理解和实践才能掌握Oracle数据库的精髓。

    成功之路Oracle11g学习笔记

    《成功之路Oracle11g学习笔记》是一本专为初学者设计的Oracle数据库学习资源,旨在帮助读者系统地掌握Oracle11g的基础知识。Oracle11g是Oracle公司推出的一个重要版本,它提供了许多增强的功能和优化,使得数据库...

    Oracle学习笔记(一天就可以学会,学不会你骂我)

    Oracle学习笔记:一天掌握核心概念 Oracle数据库系统是全球广泛使用的数据库管理系统之一,以其高效、稳定和可扩展性而著称。本教程旨在帮助你快速理解Oracle的基本概念和操作,让你在一天之内能够掌握关键知识。 ...

    玩转oracle学习笔记(三)-Oracle操作

    在Oracle数据库的世界里,"玩转Oracle学习笔记(三)-Oracle操作"主要涵盖了数据库的管理和操作方面的知识。这篇笔记可能是博主韩顺平分享的一系列Oracle学习教程中的第三部分,通过阅读他的博客文章(博文链接:...

    Oracle学习笔记.doc

    ### Oracle学习笔记知识点详解 #### 一、SQL概述与Oracle简介 - **SQL**(Structured Query Language,结构化查询语言)是一种用于管理关系型数据库的标准语言。它被用来执行各种数据库操作,如查询数据、更新数据...

Global site tag (gtag.js) - Google Analytics