- 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
- Oracle中的dual表介绍dual表介绍:
dual是一个虚拟表,用来构成select的语法规则,oracle保证dual里面永远只有一条记录
- 查看当前用户:
select user from dual;
- 查看当前日期、时间:
select sysdate from dual;
- 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)
- 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 ;
- Oracle使用plsql工具连接数据库的的相关配置
- 依次选择菜单tool-preferences-connection,然后再Oracle Home和OCl library中分别填入plsql的安装地址和oci.dll的地址
- 打开tnsnames.ora文件,并将需要连接的库的信息填入
- 回到登录页面,输入登录名和登录密码即可
- 使用%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;
- 针对分区表(比如以日期区分的表)需要先增加对应的日期分区才能插入对应的日期数据,不然会有报错提示,具体分区代码示例如下
alter table adm.test add partition part_20210912 values less than (to_date('20210913','YYYYMMDD')) COMPRESS NOLOGGING
- 复制数据到Oracle中的表
使用语句select t.* from 表名 t for update;
就可以打开锁进行复制;需要注意的是在复制的时候需要在最左侧多复制一空列,不然复制到表中会错开一个字段