oracle中需要了解的知识点

oracle中需要了解的知识点

drop、truncate和delete的区别

drop删除整张表,将表所占用的空间全部释放掉(删除结构和数据),也可以用来删除数据

truncate 一次性删除表中所有的数据,但是保留表结构。不保留日志,删除不可恢复

delete执行删除的过程是每次删除一行数据,并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作。
drop>truncate>delete

alter session enable parallel dml 使DML语句并行运行

 insert   /*+ append parallel(table1  2) */    into  table1   select   *   from  table2 ; 
 
如果需要查询语句及INSERT 语句都使用并行,那么必须运行以下命令,否则只有查询语句使用到
并行, INSERT 语句使用不到。 
 
alter session enable parallel dml

DDL

Data Definition Langaude
数据库定义语言:
建库、建表、设置约束等:create\drop\alter

DML

Data Manipulation Language
数据库操作语言:
对数据库中的数据进行一些简单操作,如insert,delete,update,select等.

execute immediate的简单用法(oracle)

create or replace procedure proc_test(
--参数区域
)
is 
--变量区域
    --sql脚本
    v_sql varchar2(2000) :='';
    --记录学生数量
    v_num number;
begin
--执行区域

    -- execute immediate用法1:立刻执行sql语句
    v_sql := 'create or replace view myview as select id,name from student';
    execute immediate v_sql;
    
    --- execute immediate用法2:立刻执行sql语句,并赋值给某个变量
    v_sql := 'select count(1) from student';
    execute immediate v_sql into v_num;
    
    -- execute immediate用法3:带参数的sql
    v_sql:='select * from student t where t.name=:1 and t.age=:2'; 
    execute immediate v_sql using 'ZhangSan',23;
    
end proc_test;
/

oracle单行函数

单行函数
操作数据对象
接受参数返回一个结果
只对一行进行变换
没行返回一个结果
可以转换数据类型
可以嵌套
参数可以是一列或一个值

NVL函数

NVL函数的格式如下:NVL(expr1,expr2)
含义是:如果oracle第一个参数为空那么显示第二个参数的值,如果第一个参数的值不为空,则显示第一个参数本来的值。

一般情况下,我们可以用nal函数坐控制处理
例如:
select cname,nvl(column,0) from temp;

NVL2函数

NVL2函数的格式如下:NVL2(expr1,expr2, expr3)
含义是:如果该函数的第一个参数为空那么显示第二个参数的值,如果第一个参数的值不为空,则显示第三个参数的值。SQL> select ename,NVL2(comm,-1,1) from emp;

常用单行函数参考:

https://blog.csdn.net/wangyeshun/article/details/82709961

Oracle并行模式(Parallel)

insert加速
insert into /*+ append parallel nologging */ dcustcomposmsg 
select /*+ parallel(e,18)*/ * from dcustcomposmsg_new e; 
commit;
select create加速
CREATE TABLE TEMP_DCUST_GRADE  NOLOGGING PARALLEL 10 AS
                   SELECT /*+PARALLEL(D,10)*/ *
                    FROM DCUST_BASIC_INFO_D PARTITION (P_'||V_TOLL_NO||') D 
                   WHERE EXISTS(SELECT ''A'' FROM DCUSTHIGH PARTITION (P_'||V_REGION_CODE||') A  WHERE D.ID_NO = A.ID_NO )
用途
强行启用并行度来执行当前SQL。这个在Oracle 9i之后的版本可以使用,之前的版本现在没有环境进行测试。也就是说,加上这个说明,可以强行启用Oracle的多线程处理功能。举例的话,就像电脑装了多核的CPU,但大多情况下都不会完全多核同时启用(2核以上的比较明显),使用parallel说明,就会多核同时工作,来提高效率。

但本身启动这个功能,也是要消耗资源与性能的。所有,一般都会在返回记录数大于100万时使用,效果也会比较明显。
语法
/*+parallel(table_short_name,cash_number)*/

这个可以加到insert、delete、update、select的后面来使用(和rule的用法差不多,有机会再分享rule的用法)

开启parallel功能的语句是:

alter session enable parallel dml;

这个语句是DML语句哦,如果在程序中用,用execute的方法打开。
实例说明
用ERP中的transaction来说明下吧。这个table记录了所有的transaction,而且每天数据量也算相对比较大的(根据企业自身业务量而定)。假设我们现在要查看对比去年一年当中每月的进、销情况,所以,一般都会写成:

select to_char(transaction_date,'yyyymm') txn_month,

       sum(

        decode(

            sign(transaction_quantity),1,transaction_quantity,0
              )

          ) in_qty,

       sum(

        decode(

            sign(transaction_quantity),-1,transaction_quantity,0
              )

          ) out_qty

  from mtl_material_transactions mmt

where transaction_date >= add_months(

                            to_date(    

                                to_char(sysdate,'yyyy')||'0101','yyyymmdd'),

                                -12)

   and transaction_date <= add_months(

                            to_date(

                                to_char(sysdate,'yyyy')||'1231','yyyymmdd'),

                                -12)

group by to_char(transaction_date,'yyyymm') 

这个SQL执行起来,如果transaction_date上面有加index的话,效率还算过的去;但如果没有加index的话,估计就会半个小时内都执行不出来。这是就可以在select 后面加上parallel说明。例如:
select /*+parallel(mmt,10)*/
       to_char(transaction_date,'yyyymm') txn_month,

...



这样的话,会大大提高执行效率。如果要将检索出来的结果insert到另一个表tmp_count_tab的话,也可以写成:
insert /*+parallel(t,10)*/
  into tmp_count_tab

(

    txn_month,

    in_qty,

    out_qty

)

select /*+parallel(mmt,10)*/
       to_char(transaction_date,'yyyymm') txn_month,

...



插入的机制和检索机制差不多,所以,在insert后面加parallel也会加速的。关于insert机制,这里暂不说了。
Parallel后面的数字,越大,执行效率越高。不过,貌似跟server的配置还有oracle的配置有关,增大到一定值,效果就不明显了。所以,一般用8,10,12,16的比较常见。我试过用30,发现和16的效果一样。不过,数值越大,占用的资源也会相对增大的。如果是在一些package、function or procedure中写的话,还是不要写那么大,免得占用太多资源被DBA开K。
各种写法的性能
参考:
https://blog.csdn.net/zhangqinghao9203/article/details/38389935?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase

最优选择:
用parallel,并用别名作为参数,起别名
select /*+parallel(a,16)*/ distinct a.code,c.name statement a where ......

Oracle case when 用法介绍

case when表达式有两种形式
--简单Case函数  

CASE sex  
WHEN '1' THEN '男'  
WHEN '2' THEN '女'  
ELSE '其他' END  

--Case搜索函数  

CASE
WHEN sex = '1' THEN '男'  
WHEN sex = '2' THEN '女'  
ELSE '其他' END  

oracle常见数据类型及类型间的区别

oracle中我们常用的数据类型

可参考:https://www.cnblogs.com/buxingzhelyd/p/8984173.html

字段类型 中文说明 限制条件 其他说明
CHAR 固定长度字符串 最大长2000bytes
VARCHAR,VARCHAR2 可变字符串 最大长度4000 bytes 可做索引的最大长度749
NUMBER(P,S) 数字类型 P为总位数,S为小数位数
DATE 期(日-月-年) DD-MM-YY(HH-MI-SS) 经过严格测试,无千虫问题
BLOB 二进制数据 最大长度4G
CLOB 字符数据 最大长度4G
varchar与varchar2
varchar和varchar2 暂时没有本质的区别。varchar2是oracle独有的,在oracle中还是使用varchar2

1.varchar是标准sql里面的。 varchar2是oracle提供的独有的数据类型。

2.varchar对于汉字占两个字节,对于英文是一个字节,占的内存小,varchar2都是占两个字节。

3.varchar对空串不处理,varchar2将空串当做null来处理。

4.varchar存放固定长度的字符串,最大长度是2000,varchar2是存放可变长度的字符串,最大长度是4000.

5.如果是要跟换不同的数据库,例如mysql,那么就用varchar,如果就用oracle,那么用varchar2比较好一点。

注意:
varcahr2虽然是可变的,但存储的数据长度不能大于定义的数据长度

CREATE TABLE 表名 AS SELECT 语句

可以参考:

https://www.cnblogs.com/daimaxuejia/p/10619242.html

新表不存在

create table new_table  select * from old_talbe;

这种方法会将old_table中所有的内容都拷贝过来,用这种方法需要注意,new_table中没有了old_table中的primary key,Extra,auto_increment等属性,需要自己手动加,具体参看后面的修改表即字段属性

旧表的数据量比较大的时候
create table new_table parallel 4 nologging as select * from old_talbe;

只需要复制表结构

# 第一种方法,和上面类似,只是数据记录为空,即给一个false条件
 
create table new_table select * from old_table where 1=2;
  
# 第二种方法
create table new_table like old_table;

**新表存在

**复制旧表数据到新表(假设两个表结构一样)

insert into new_table select * from old_table

复制旧表数据到新表(假设两个表结构不一样)

insert into new_table(field1,field2,.....) select field1,field2,field3 from old_table;

复制全部数据

select * into new_table from old_table; 

只复制表结构到新表

select * into new_talble from old_table where 1=2;

create table a like b;
 
create table c_relation as select c.memberId,m.merchantId,memb.phone from c_merchant as m inner join c_customer c on c.userId=m.userId inner join c_member memb on memb.id=c.memberId where memb.status=10;

由上面的使用 CREATE TABLE 表名 AS SELECT 语句可以看出:

1:只会复制表数据和表结构,不会有任何约束。

2:当 where 条件不成立时,只复制表结构,没有任务数据

1 mysql

create table t2 as select c1 from t1;   --正确,一般用法

--新表中对列重命名
create table t2 as select c1 c2 from t1;    --正确

create table t2(c2 varchar(50)) as select c1 from t1;   --语法正确,但不是预期结果
desc t2;    --c1, c2

create table t2(c2) as select c1 from t1;       --错误
--------------------- 

2 oracle

create table t2 as select c1 from t1;   --正确,一般用法

--新表中对列重命名
create table t2 as select c1 c2 from t1;    --正确

create table t2(c2) as select c1 from t1;       --正确
desc t2;    --c2

create table t1(col1 varchar(255)) as select c1 from t1;    --错误,不能指定数据类型

你可能感兴趣的:(oracle,oracle)