PL/SQL开发

一、ORACLE数据库基础

1. oracle数据库服务端/客户端

安装好oracle数据库后,有三个文件:①sqlnet.ora;②tnsnames.ora;③listener.ora。listener.ora文件一般存在于服务端,用于监听,sqlnet.ora,tnsnames.ora这两个文件,用于客户端配置连接。tnsnames.ora位置路径通常在:$ORACLE_HOME/network/admin。
查看监听:lsnrctl status
关闭监听:lsnrctl stop
启动监听:lsnrctl start
网络访问oracle数据库:sqlplus username/passwd@string(这里的username为用户名,passwd为密码,@string为tnsnames.ora文件中的配置连接名称)。
服务端访问oracle数据库:sqlplus username/passwd(同上)。
通常情况下oracle数据会建立两个管理员账户:sys/system
关闭(shutdown immediate)开启(startup)数据库都必须在sys用户下。
oracle的一般启动过程如下:
shutdown-------“startup”--------->open
open-------“shutdown immediate”----->shutdown
shutdown-------nomount------mount------>open
shutdown------“startup mount”------------->mount
shutdown------“startup nomount”------------->nomount

2. oracle数据库基本使用

(1)表空间(tablespace)
操作语句
创建零时表空间 tempcreate temporary tablespace …
创建表空间create tablespace 表空间名 datafile ‘数据库表空间路径’ size 20M(表空间大小)
加表空间alter tablespace 表空间名 add datafile ‘数据库表空间路径’ size 20M(表空间大小)
删除表空间drop tablespace 表空间名 including contents and datafiles --删除表空间,对象和数据文件
(2)创建操作
操作语句
创建用户create user 用户名 identified by passwod default tablespace 表空间名
删除用户drop user用户名 cascade --cascade:级联删除,删除该用户相关的对象
用户改密码alter user 老用户名 identified by 新用户名密码
建新表create table 表名(字段名 字段类型等)
例如:create table mg (fid number(10),name varchar2(24),age number(3));
建索引CREATE INDEX 索引名 ON 表名 ( 字段1, [字段2, ……] )
建视图CREATE VIEW 视图名 AS SELECT …. FROM ……
建物化视图
(相当于一种物理表(user_tables),也是一种段(segment))
CREATE materialized VIEW 视图名 refresh force on demand start with sysdate next to_date( concat( to_char( sysdate+1,‘dd-mm-yyyy’),’ 22:00:00’),‘dd-mm-yyyy hh24:mi:ss’) AS SELECT …. FROM ……(指定每天自动刷新时间为22点,相当于手动刷新模式)
create materialized view 视图名 refresh force on commit as select * from table_name(自动刷新,一旦有commit操作,立刻更新该视图)
建同义词(SYNONYM)CREATE SYNONYM 同义词名 FOR 表名
CREATE SYNONYM 同义词名 FOR 表名@数据库链接名
建数据库链接(DATABASE LINK)CREATE DATABASE LINK 数据库链接名 CONNECT TO 用户名 IDENTIFIED BY 密码 USING ‘数据库连接字符串’
create public database link link名字 connect to 所连接数据库的用户名 identified by "密码"using ‘(DESCRIPTION(ADDRESS=(PROTOCOL=TCP)(HOST=所连接数据库IP)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=所连接数据库实例名)))’;
(3)权限管理 (DCL) 语句
常用的系统权限集合说明
CONNECT基本的连接
RESOURCE程序开发
DBA数据库管理
常用的数据库对象权限说明
ALL ON 数据对象名所有操作权限
SELECT ON 数据对象名查询权限
UPDATE ON 数据对象名更新权限
DELETE ON 数据对象名删除权限
INSERT ON 数据对象名插入权限
ALTER ON 数据对象名修改权限
GRANT赋予权限REVOKE回收权限
GRANT CONNECT, RESOURCE TO 用户名REVOKE CONNECT, RESOURCE FROM 用户名
GRANT SELECT ON 表名 TO 用户名REVOKE SELECT ON 表名 FROM 用户名
GRANT SELECT, INSERT, DELETE ON表名 TO 用户名1, 用户名2REVOKE SELECT, INSERT, DELETE ON表名 FROM 用户名1, 用户名2
(4)SQL分类

   DDL(定义语言):create alter drop 等;
  DML(操作语言):insert delete update select 等;
   DCL(控制语言):commit rollback 等;

(5)主键,外键和索引的区别
主键外键索引
定义:唯一标识一条记录,不能重复,不允许为空表的外键是另一表的主键,可以有重复,可以是空值不允许有重复,但可以有一个空值
作用:保证数据完整性用来和其他表建立联系提高查询排序速度
个数:一个表主键只能有一个一个表可以有多个外键一个表可以有多个唯一索引
(6)表信息
语句含义
select * from user_tab_comments获取所有表注释信息
select * from all_tab_columns获取表字段,所有用户
select * from user_tab_columns获取表字段,当前用户下
select * from all_tables获取所有用户表
select * from user_tables获取当前用户表
select * from dba_tables获取所有表,包括系统表,DBA权限

3. ORACLE数据库数据表改变操作

操作语句
增加字段Alter Table 表名 Add (字段名称 字段类型,字段名称 字段类型)
修改字段Alter Table 表名 modify (字段名称 (新的)字段类型/字段长度)
Alter Table 表名 rename column (旧的)字段名称 to (新的)字段名称
删除字段alter table 表名 drop column 字段名称
修改表里字段的定义描述ALTER TABLE表名 MODIFY 字段名 字段名描述
改变表的名称ALTER TABLE 表名1 TO 表名2
给表里的字段加上约束条件ALTER TABLE 表名 ADD CONSTRAINT 约束名 PRIMARY KEY (字段名)
ALTER TABLE 表名 ADD CONSTRAINT 约束名 UNIQUE (字段名)
把表放在或取出数据库的内存区ALTER TABLE 表名 CACHE
ALTER TABLE 表名 NOCACHE
删除表和它所有的约束条件DROP TABLE 表名 CASCADE CONSTRAINTS
清空表里的所有记录, 保留表的结构TRUNCATE 表名
查询数据库中的表select * from user_tables --查询当前登陆用户下所有的表
select * from all_tables --查询当前连接数据库(实例)下所有的表

4. ORACLE数据库创建存储过程,函数,包,触发器

(1)创建存储过程
    create or replace procedure procedure_name(
                v_tempnum in varchar2,-----入参
                v_tempout out number  -----出参is --is/as 都可以
            vsal number(7,2);
            begin
            ...............    -------处理逻辑
            end procedure_name;
(2)创建函数
    create or replace function function_name(name in type,age in type ...)
              return number is -- is/as均可以
              result number;
              begin
              ...............     ------处理逻辑
              return result;
              end
(3)创建包
    # (1) 创建包规范
    create package emp_pkg is
     procedure emp_update_ename(v_empno varchar2,v_ename varchar2);
     function emp_get_sal(v_empno varchar2) return number;
     end;
    #(2)创建包体
    create or replace package body emp_pkg
    is
        procedure emp_update_ename
        (
        v_empno varchar2,
        v_ename varchar2
        )
        is
        vename varchar2(32);
        begin
        update emp set ename=v_ename where empno=v_empno;
        commit;
        select ename into vename from emp where empno=v_empno;
        dbms_output.put_line('雇员名称:'||vename);
        end;
        function emp_get_sal
        (
        v_empno varchar2
        )
        return number is
        vsal number(7,2);
        begin
        select sal into vsal from emp where empno=v_empno;
        return vsal;
        end;
    end;
(4)创建触发器
     /*
     触发器组成:
      1.触发事件:引起触发器被触发的事件。如:DML语句(INSERT,UPDATE,DELATE对表或者视图执行数据处理操作、DDL语句(如CREATE,ALTER,DROP创建,修改,删除模式对象)等
      2.触发时间:即该trigger是在触发事件发生之前(before)还是之后(after)触发
      3.触发操作:即该TRIGGER 被触发之后的目的和意图,正是触发器本身要做的事情。 例如:PL/SQL 块。
      4.触发对象:包括表、视图、模式、数据库。只有在这些对象上发生了符合触发条件的触发事件,才会执行触发操作。
      5.触发条件:由WHEN子句指定一个逻辑表达式。只有当该表达式的值为TRUE时,遇到触发事件才会自动执行触发器,使其执行触发操作。
      6.触发频率:说明触发器内定义的动作被执行的次数。即语句级(STATEMENT)触发器和行级(ROW)触发器。
    */
    create or replace trigger test_trigger
      after DELETE OR INSTER OR UPDATE ON TEST     ---对表TEST的操作
     DECLARE
      V_TYPE TEST_LOG.L_TYPE%TYPE;
      BEGIN
        IF INSERTING THEN
          V_TYPE:='INSERT';
          DBMS_OUTPUT.PUT_LINE('记录已经成功插入,并记录到日志')
        ELSIF UPDATING THEN
          V_TYPE := 'UPDATE';
          DBMS_OUTPUT.PUT_LINE('记录已经成功更新,并记录到日志')
        ELSIF DELETING THEN
          V_TYPE := 'DELETE'
          DBMS_OUTPUT.PUT_LINE('记录已经成功删除,并记录到日志'END IF;
    
      INSERT INTO TEST_LOG VALUES(USER,V_TYPE,TO_CHAR(SYSDATE,'yyyy-mm-dd hh24:mi:ss'));
     END
(5)索引
--创建索引
create index index_name on table(column_name1,column_name2);
--创建唯一索引
create index unique index_name on table(column_name1,column_name2);
--删除索引
drop index index_name;
--重命名索引
alter index index_name rename to index_name1;
--合并索引(表使用一段时间后在索引中会产生碎片,此时索引效率会降低,可以选择重建索引或者合并索引,合并索引方式更好些,无需额外存储空间,代价较低)
alter index index_name coalesce;
--重建索引
alter index index_name rebuild;
--查看索引
select index_name,index-type, tablespace_name, uniqueness from all_indexes where table_name ='tablename';
--查询数据库下所有索引信息
select * from user_indexes;
--批量重建索引
/*按用户(表空间)将此用户(表空间)下面非临时表上面的索引全部重建,此过程建议在SYS用户下面执行:*/
CREATE OR REPLACE PROCEDURE BATCH_REBUILD_INDEX(USER_NAME IN VARCHAR2) IS
  S_SQL   VARCHAR2(500);
  ACCOUNT NUMBER := 0;
BEGIN
  FOR LINE2 IN (SELECT T.OWNER, T.INDEX_NAME
                  FROM ALL_INDEXES T
                 WHERE T.OWNER = UPPER(USER_NAME)
                   AND T.TABLE_TYPE = 'TABLE'
                   AND T.TEMPORARY = 'N'
                   AND T.INDEX_TYPE = 'NORMAL') LOOP
    S_SQL   := 'alter index ' || LINE2.OWNER || '.' || LINE2.INDEX_NAME ||
               ' rebuild';
    ACCOUNT := ACCOUNT + 1;
    EXECUTE IMMEDIATE S_SQL;
  END LOOP;
  DBMS_OUTPUT.PUT_LINE(ACCOUNT);
EXCEPTION
  WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE(SQLERRM);
END BATCH_REBUILD_INDEX;
--执行过程实现批量更改
begin
  -- Call the procedure
  batch_rebuild_index(user_name => 'hs_user'); --输入用户名
end;
(6)创建JOB
    --建表  
    create table test_job(para_date date);  
    commit;  
     
    insert into test_job values(sysdate);  
    commit; 
     
    select * from test_job;
     
    --建立存贮过程   
    create or replace procedure test_jobproce   as 
    begin 
    insert into test_job values(sysdate);  
    end test_jobproce; 
     
    --建立job  
    --建立job后默认是执行的  
     
    declare  test_job_really number;  
    begin 
    dbms_job.submit(test_job_really,'test_jobproce;',sysdate,'sysdate+1/1440');  
    commit;  
    end;  
     
    --停止job  25是建立的job test_job_really  
    begin 
    dbms_job.broken(25,true);  
    commit;  
    end;  
     
    --启动job  
    begin 
    dbms_job.run(25);  
    commit;  
    end;  
     
    --删除job  
     
    begin  
    dbms_job.remove(25);  
    commit;  
    end;  

JOB中常用的参数

字段(列)类型描述
JOBNUMBER任务的唯一标示号
LOG_USERVARCHAR2(30)提交任务的用户
PRIV_USERVARCHAR2(30)赋予任务权限的用户
SCHEMA_USERVARCHAR2(30)对任务做语法分析的用户模式
LAST_DATEDATE最后一次成功运行任务的时间
LAST_SECVARCHAR2(8)如HH24:MM:SS格式的last_date日期的小时,分钟和秒
THIS_DATEDATE正在运行任务的开始时间,如果没有运行任务则为null
THIS_SECVARCHAR2(8)如HH24:MM:SS格式的this_date日期的小时,分钟和秒
NEXT_DATEDATE下一次定时运行任务的时间
TOTAL_TIMENUMBER该任务运行所需要的总时间,单位为秒
BROKENVARCHAR2(1)标志参数,Y标示任务中断,以后不会运行
INTERVALVARCHAR2(200)用于计算下一运行时间的表达式
FAILURESNUMBER任务运行连续没有成功的次数
WHATVARCHAR2(2000)执行任务的PL/SQL块
CURRENT_SESSION_LABELRAWMLSLABEL 该任务的信任Oracle会话符
CLEARANCE_HIRAW MLSLABEL该任务可信任的Oracle最大间隙
CLEARANCE_LORAWMLSLABEL 该任务可信任的Oracle最小间隙
NLS_ENVVARCHAR2(2000)任务运行的NLS会话设置
MISC_ENVRAW(32)任务运行的其他一些会话参数

JOB中常用的时间设置

描述INTERVAL参数值
每天午夜12点TRUNC(SYSDATE + 1)
每天早上8点30分TRUNC(SYSDATE + 1) + (8×60+30)/(24×60)
每星期二中午12点NEXT_DAY(TRUNC(SYSDATE ), ‘‘TUESDAY’’ ) + 12/24
每个月第一天的午夜12点TRUNC(LAST_DAY(SYSDATE ) + 1)
每个季度最后一天的晚上11点TRUNC(ADD_MONTHS(SYSDATE + 2/24, 3 ), ‘Q’ ) -1/24
每星期六和日早上6点10分TRUNC(LEAST(NEXT_DAY(SYSDATE, ''SATURDAY"), NEXT_DAY(SYSDATE, “SUNDAY”))) + (6×60+10)/(24×60)
每周一凌晨2点执行TRUNC(next_day(sysdate,2))+2/24
每分钟执行TRUNC(sysdate,’mi’) + 1 / (24*60)
每天的凌晨2点执行TRUNC(sysdate) + 1 +2 / (24)
每月1日凌晨2点执行TRUNC(LAST_DAY(SYSDATE))+1+2/24
每季度的第一天凌晨2点执行TRUNC(ADD_MONTHS(SYSDATE,3),‘Q’) + 2/24
每年7月1日和1月1日凌晨2点ADD_MONTHS(trunc(sysdate,‘yyyy’),6)+2/24
每年1月1日凌晨2点执行ADD_MONTHS(trunc(sysdate,‘yyyy’),12)+2/24
(7)创建序列
CREATE SEQUENCE sequence_name //创建序列名称
[INCREMENT BY n] //递增的序列值是 n 如果 n 是正数就递增,如果是负数就递减 默认是 1
[START WITH n] //开始的值,递增默认是 minvalue 递减是 maxvalue
[{MAXVALUE n | NOMAXVALUE}] //最大值  
[{MINVALUE n | NOMINVALUE}] //最小值
[{CYCLE | NOCYCLE}] //循环/不循环
[{CACHE n | NOCACHE}];//分配并存入到内存中
CREATE SEQUENCE  sequence1 MINVALUE 1 NOMAXVALUE INCREMENT BY 1 START WITH 1 NOCACHE --创建以1开始无上限自增1的序列
CREATE TABLE table_name
(
  ID NUMBER(24, 0) default "sequence1"."NEXTVAL" NOT NULL 
  )----建表时利用序列生成自增ID
(8)创建快照   
/*
快照的作用主要是能够进行在线数据恢复,当存储设备发生应用故障或者文件损坏时可以进行及时数据恢复,将数据恢复成快照产生时间点的状态。快照的另一个作用是为存储用户提供了另外一个数据访问通道,当原数据进行在线应用处理时,用户可以访问快照数据,还可以利用快照进行测试等工作。
源数据库:被同步的数据库
目的数据库:要同步的数据库
*/
--1.在目的数据库上创建dblink
create public database link TestDblink  --TestDblink是创建的dblink的名字
connect to dbName identified by dbPassword --dbName:源数据库用户;dbPassword:源数据库密码
 using '(DESCRIPTION =(ADDRESS_LIST =(ADDRESS =(PROTOCOL = TCP)(HOST = 192.168.2.158)---元数据库地址
 (PORT = 1521)))
 (CONNECT_DATA =(SERVICE_NAME = orcl)))'--源数据库的实例名
--2.在目的数据库上,测试dblink
select * from test_table@TestDblink --test_table是源数据库的表
--3.在源数据库上,创建要同步表的快照日志
create snapshot log on test_table
--4.在源数据库上,创建要同步表的快照日志
create snapshot sn_test_table as select * from test_table@TestDblink
--5.设置快照刷新时间(快速刷新,在源数据库表上有快照日志)
alter snapshot sn_test_table refresh fast start with sysdate+30/(24*60*60) next sysdate+30/(24*60*60) --30秒后自动刷新,并隔30秒刷新一次
--6.查看快照最后一次刷新时间
SELECT NAME,LAST_REFRESH FROM ALL_SNAPSHOT_REFRESH_TIMES
--7.查看快照下次执行时间
select last_date,next_date,what from user_jobs order by next_date
--8.查询快照   sn_test_table是目的数据库中的快照
select * from sn_test_table
--9.销毁快照
drop snapshot sn_test_table

5.AWR报告的获取和分析

/*使用SQL*Plus命令行的方式获取,运行awrrpt.sql脚本文件,该脚本文件凡在$ORACLE_HOME/rdbms/admin目录下*,运行该脚本的用户必须具有SELECT_CATALOG_ROLE系统权限/
sql>awrrpt.sql
--输入 report_type的值:(回车默认html)报告显示格式
--输入num_days的值:(回车默认系统中全部的快照)
--输入begin_snap的值:(开始快照ID)
--输入end_snap的值:(结束快照ID)
--输入report_name的值:(输入awr报告的名称)
--更改扩展名为.htm
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值