Oracle数据库的学习(一)

--使用SQL Plus登录账户
请输入用户名:如下

例:

<span style="font-size:14px;">1)请输入用户名:conn/as sysdba
   输入口令:(直接回车)
2)请输入用户名:/as sysdba;//登陆sys帐户
3)请输入用户名:sys as sysdba;//同上
4)请输入用户名:scott/tiger;//登陆普通用户scott</span>
--创建用户
create user username identified by password;
例:create user my_test identified by Oracle123;
--修改密码
alert user username identified by newPassword;
例:alert user scott identified by tiger;
--删除用户
drop user username cascade;//级联
例:drop user my_test cascade;
--授权
connect--用户连接,或者是登录
resource --资源权限
dba --最大的权限
	系统权限
	CREATE SESSION                     创建会话
	CREATE SEQUENCE                    创建序列
	CREATE SYNONYM                     创建同名对象
	CREATE TABLE                       在用户模式中创建表
	CREATE ANY TABLE                   在任何模式中创建表
	DROP TABLE                         在用户模式中删除表
	DROP ANY TABLE                     在任何模式中删除表
	CREATE PROCEDURE                   创建存储过程
	EXECUTE ANY PROCEDURE              执行任何模式的存储过程
	CREATE USER                        创建用户
	DROP USER                          删除用户
	CREATE VIEW                        创建视图
grant connect,resource,dba to username;

--取消授权
grant dba to user
revoke dba from user
<p class="sql" name="code">
</p><p class="sql" name="code">--创建一个序列<div class="sql" name="code"><pre class="sql" name="code">create sequence my_seq
minvalue 1
maxvalue 200
start with 1
increment by 1
cache 99;

--删除序列
drop sequence my_seq;

--零时表dual
select my_seq.nextval from dual;

 


触发器

创建一个触发器:插入一条数据,同时监听一下,将插入的数据记录下来

create or replace trigger trigger_insert
  after insert on dept
  for each row	--对表的每一行触发器执行一次
begin
  insert into dept_bak
  values
    (my_seq.nextval, :new.deptno, :new.dname, :new.loc);  --:new表示新插入的那条记录
end;

向表dept插入一条新数据

insert into dept values(10,'翻译部门','太原');

查询表dept_bak结果

select * from dept_bak;


再创建一个触发器:删除表dept的数据时,将该删除数据记录到表dept_bak中

create or replace trigger trigger_delete
  after delete on dept
  for each row
begin
  insert into dept_bak
    (id, deptno, dname, loc, name)
  values
    (my_seq.nextval, :old.deptno, :old.dname, :old.loc, '删除数据');
end;

删除表dept中的一条数据

delete from dept where deptno = 1;

查询表dept_bak结果

select * from dept_bak;


创建一个触发器:如果插入数据就将插入的数据记录下来,如果删除数据就将删除的数据记录下来,如果是修改数据就将修改前的数据记录下来

create or replace trigger my_trigger
  after insert or delete or update on dept
  for each row
begin
  --如果是插入数据
  if inserting then
    insert into dept_bak
      (id, deptno, dname, loc, name)
    values
      (my_seq.nextval, :new.deptno, :new.dname, :new.loc, '新增数据');
  end if;
  --如果是删除数据
  if deleting then
    insert into dept_bak
      (id, deptno, dname, loc, name)
    values
      (my_seq.nextval, :old.deptno, :old.dname, :old.loc, '删除数据');
  end if;
  --如果是修改数据
  if updating then
    insert into dept_bak
      (id, deptno, dname, loc, name)
    values
      (my_seq.nextval, :old.deptno, :old.dname, :old.loc, '修改数据');
  end if;
end;

测试一下:

--插入一条数据
insert into dept values(9,'财务部门','北京');

select * from dept_bak;



--删除一条数据
delete from dept where deptno = 2;
<pre class="sql" name="code">select * from dept_bak;
 

--修改一条数据
update dept set loc = '南京' where deptno = 20;
select * from dept_bak;

存储过程

写一个存储过程查询数据

create or replace procedure my_first_pro as 
  my_id number;
begin
  select count(*) into my_id from dept;
  dbms_output.put_line('数据的个数:'||my_id);
  commit;
end;
begin
  my_first_pro();
end;
数据的个数:2
写一个存储过程删除数据
create or replace procedure my_second_pro(id number) as
  dept_exception exception;
  pragma exception_init(dept_exception, -1);
begin
  delete from dept where deptno = id;
  commit;
exception
  when dept_exception then
    dbms_output.put_line('删除数据失败!');
    dbms_output.put_line(sqlcode || '------------' || sqlerrm);
  when others then
    dbms_output.put_line(sqlcode || '------------' || sqlerrm);
end;
新建一个测试表user_test
create table user_test(id number(10),username varchar2(20),primary key(id));
insert into user_test values(1,'倪好');
写一个存储过程插入数据
create or replace procedure insert_pro(id number, username varchar2) as
  my_exception exception;
  pragma exception_init(my_exception, -1);
begin
  insert into user_test values (id, username);
  commit;
exception
  when my_exception then
    dbms_output.put_line('违反主键约束');
    dbms_output.put_line(sqlcode || '------------' || sqlerrm);
end;
set serveroutput on;--设置在窗口可以打印数据
execute insert_pro(1,'hello');
违反主键约束
-1------------ORA-00001:违反唯一约束条件(CY.SYS_C0011056)
---使用loop插入多条数据
create procedure insert_loop(id number, username varchar2) as
begin
  for i in 1 .. 100 loop
    insert into user_test01 values (id, username);
    commit;
  end loop;
end;<span style="font-family:FangSong_GB2312">
</span>

游标

查询有多条数据,把多条数据打印到控制台上,使用plsql
声明游标后,通过for循环来获取游标中的数据
create or replace procedure select_cursor as
  cursor my_cursor is
    select * from dept;
  row my_cursor%rowtype;--定义一个游标变量,类型是游标的一行数据
begin
  for row in my_cursor loop
    dbms_output.put_line(row.deptno || ',' || row.dname || ',' || row.loc);
  end loop;
end;

声明游标后,通过fetch into来打开游标从而获取游标中的数据

create or replace procedure second_select_cursor(deptno number) as
  cursor my_cursor is
    select * from emp where deptno = deptno;
  row my_cursor%rowtype;
begin
  --获取游标中的数据
  open my_cursor;
  loop
    fetch my_cursor
      into row;
    --设置退出的游标
    exit when my_cursor%notfound;
    dbms_output.put_line(row.empno || ',' || row.ename || ',' || row.sal);
  end loop;
  close my_cursor;
end;

包体

第一部分是包:组件的声明
create or replace package my_package is
  procedure my_pro01(id number);--声明组件
  procedure my_pro02;--声明组件
end my_package;
第二部分是包体:组件内容的具体实现
create or replace package body my_package is
  --声明组件
  procedure my_pro01(id number) is
  begin
    insert into dept (deptno, dname) values (id, '技术部门');
  end my_pro01;
  --声明组件
  procedure my_pro02 is
  begin
    insert into dept (deptno, dname) values (2, '市场调研部门');
  end my_pro02;
end my_package;
--执行包体的语法:exec/execute package.procedure;
exec my_package.my_pro01(5);
execute my_package.my_pro02;
 

分页

select b.*, b.rm
  from (select a.*, rownum rm 
       from (select e.* from emp e) a) b
  where b.rm between 11 and 15;

page:页数	pageNumber:每一页最多展示5条数据
第1页:	(1,pageNumber)	1-5
第2页:	((2-1)*pageNumber+1,pageNumber*2)	6-10
第3页:	((3-1)*pageNumber+1,pageNumber*3)	11-15
第page页:	((page-1)*pageNumber+1,pageNumber*page)	





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值