Oracle数据库

  1. Oracle中的序列(SEQUENCE)序列的使用:
    序列(SEQUENCE)是序列号生成器,可以为表中的行自动生成序列号,产生一组等间隔的数值(类型为数字)。不占用磁盘空间,占用内存。
    其主要用途是生成表的主键值(在Oracle中insert into有用到),可以在插入语句中引用,也可以通过查询检查当前值,或使序列增至下一个值。
    • 创建名为seq_test的序列:CREATE SEQUENCE seq_test
    • 序列创建后,可以使用序列的NEXTVAL来获取序列的下一个值,使用CURRVAL来查看当前值。第一次使用必须先使用NEXTVAL来产生一个值后才可以使用CURRVAL进行查看。
      产生一个新的序列:select seq_test.nextval from dual
      查看当前序列的值:select seq_test.currval from dual
  2. Oracle中的dual表介绍dual表介绍:
    dual是一个虚拟表,用来构成select的语法规则,oracle保证dual里面永远只有一条记录
    • 查看当前用户:select user from dual;
    • 查看当前日期、时间:select sysdate from dual;
  3. Oracle中的with as用法
    with as的作用其实就是把一大堆重复用到的sql语句放在with as里面,取一个别名,后面的查询就可以用它,这样对于大批量的sql语句起到一个优化的作用,而且清楚明了。
    针对一个别名:with tmp as (select * from tb_name)
    针对多个别名:
with
   tmp as (select * from tb_name),
   tmp2 as (select * from tb_name2),
   tmp3 as (select * from tb_name3)
  1. Oracle中的rownumrownum使用参考:
    rownum是个伪列,是Oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,返回的第二行分配的是2,以此类推,其作用类似于MySQL中的limit。
    • 例如,我们现在只想看到emp表中的第一条记录:select * from emp where rownum=1;
    • 现在,我们现在想查看emp中的前2条记录:select * from emp where rownum<=2;
    • 假如我们现在只想查看emp中的第二条记录,则需要用到子查询,因为rownum并不是当作实体数据存放在每一张表中,而是在每一次select查询的时候,根据基表的默认insert顺序由oracle动态分配的,有1才有2,如果rownum没有1,那么2也就没有了意义
select * 
from 
       ( select rownum as rn, t.* from emp t where rownum<=2 )
where rn=2 ;
  1. Oracle使用plsql工具连接数据库的的相关配置
    • 依次选择菜单tool-preferences-connection,然后再Oracle Home和OCl library中分别填入plsql的安装地址和oci.dll的地址
    • 打开tnsnames.ora文件,并将需要连接的库的信息填入
    • 回到登录页面,输入登录名和登录密码即可
  2. 使用%type、%rowtype定义变量参考来源
    两种方法都是为了使新变量的数据类型与已经定义了的变量(尤其是表的某一列)的数据类型相一致,且当被参照的那个变量的数据类型改变了之后,这个新定义的变量的数据类型会自动跟随其改变,容易保持一致,也不用修改PL/SQL程序了。不同之处是%type是定义一个新的变量,%type前面接的是被参数的变量名,而%rowtype是因为需要定义的变量较多,且都来源于同一个表,%rowtype前面接的是被参数的表,再后面用到的时候需要后接“.列名”,语法如下:
DECLARE   
  V_ORG_NAME SF_ORG.ORG_NAME%TYPE; --与ORG_NAME类型相同  
  V_PARENT_ID SF_ORG.PARENT_ID%TYPE;--与PARENT_ID类型相同   
BEGIN  
  SELECT ORG_NAME,PARENT_ID INTO V_ORG_NAME,V_PARENT_ID  
  FROM SF_ORG SO  
  WHERE SO.ORG_ID=&ORG_ID;  
  DBMS_OUTPUT.PUT_LINE('部门名称:' || V_ORG_NAME);  
  DBMS_OUTPUT.PUT_LINE('上级部门编码:' || TO_CHAR(V_PARENT_ID));  
END; 
DECLARE   
  V_SF_ORG_REC SF_ORG%ROWTYPE; --与SF_ORG表中的各个列相同  
BEGIN  
  SELECT * INTO V_SF_ORG_REC  
  FROM SF_ORG SO  
  WHERE SO.ORG_ID=&ORG_ID;  
  DBMS_OUTPUT.PUT_LINE('部门ID:' || TO_CHAR(V_SF_ORG_REC.ORG_ID));  
  DBMS_OUTPUT.PUT_LINE('部门名称:' || V_SF_ORG_REC.ORG_NAME);  
  DBMS_OUTPUT.PUT_LINE('上级部门编码:' || TO_CHAR(V_SF_ORG_REC.PARENT_ID));  
END; 
  1. 针对分区表(比如以日期区分的表)需要先增加对应的日期分区才能插入对应的日期数据,不然会有报错提示,具体分区代码示例如下
    alter table adm.test add partition part_20210912 values less than (to_date('20210913','YYYYMMDD')) COMPRESS NOLOGGING
  2. 复制数据到Oracle中的表
    使用语句select t.* from 表名 t for update;就可以打开锁进行复制;需要注意的是在复制的时候需要在最左侧多复制一空列,不然复制到表中会错开一个字段
posted @ 2020-06-01 15:49  蔓越煤  阅读(218)  评论(0编辑  收藏  举报