oracle及pl/sql常用记录

一、复制表或者数据
1. 复制表结构及其数据: 
      create table table_name_new as select from table_name_old   
2. 只复制表结构: 
      create table table_name_new as select from table_name_old where 1=2; 
      或者: 
      create table table_name_new like table_name_old  
 
3. 只复制表数据: 
      如果两个表结构一样: 
      insert into table_name_new select from table_name_old 
      如果两个表结构不一样: 
      insert into table_name_new(column1,column2...) select column1,column2... from table_name_old
二、清空表

        用truncate、delete都可以清空表中数据。
        SQL如下:
        truncate table [表名];
        delete from [表名];

        delete与truncate的区别:
        delete:会产生rollback,如果删除大数据量的表速度会很慢,同时会占用很多的rollback segments。
        truncate: 是DDL操作,不产生rollback,速度快。

三、PL/SQL的文本导入工具

  工具---文本导入工具,可导入txt,csv等。

  文本内第一行写标题,最好和表相对应,工具会自动识别。详细内容

四、pl/sql执行一些耗时的操作时,可能会卡住,鼠标会一直转圈,无法得知进度,此时可以另开了个pl/sql,用sql去查看表的状态来判断执行进度。

  比如一次性导入几十万数据的操作,可能需要几十分钟分钟执行,期间你不知道是卡住了还是正常执行,另起一个pl/sql去count一下数据量,做个简单的判断。

五、根据rowid删除重复记录

delete from table_name 
    t1 
where 
    rowid not in(
        select min(rowid) 
        from table_name t2  
        where t2.id is not null  having count(id) >1 
        group by t2.id)

六、decode使用  连接符号“||”字段拼接

select 
    t.*,  
    h.area_code,  
    a.area_name,  
    DECODE(h.verify_code,1,'部分缴费',2,'全部缴费',3,'欠费多缴',4,'不欠费预存') 
from 
    ZFBPOS_HN_SERIAL t,SERIAL_HISTORY_2018 h,AREA_REF a 
where 
    'ALI'||t.ali_serial_no=h.old_serial_no 
    and h.area_code=a.area_id 
    and to_char(h.tran_date,'yyyymm')<'201806';

七、windows下sqlplus管理员无密码登录数据库

首先,开始菜单,cmd,弄出来黑色窗口

sqlplus /nolog
connect /as sysdba
//赋给用户连接权限
grant create session to username;

八、oracle连接数

  在查看数据的连接情况很有用,写完程序一边测试代码一边查看数据库连接的释放情况有助于分析优化出一个健壮的系统程序来。

  1、查看当前的数据库连接数

     select count(*) from v$process ;    --当前的数据库连接数

  2、数据库允许的最大连接数

     select value from v$parameter where name ='processes';  --数据库允许的最大连接数

  3、修改数据库最大连接数
     alter system set processes = 300 scope = spfile;  --修改最大连接数:

  4、关闭/重启数据库
     shutdown immediate; --关闭数据库
     startup; --重启数据库

  5、查看当前有哪些用户正在使用数据 

    select osuser, a.username, cpu_time/executions/1000000||'s', b.sql_text, machine
    from v$session a, v$sqlarea b
    where a.sql_address =b.address
    order by cpu_time/executions desc;  --查看当前有哪些用户正在使用数据

  6、 --当前的session连接数 

     select count(*) from v$session  --当前的session连接数

  7、当前并发连接数

     select count(*) from v$session where status='ACTIVE'; --并发连接数 

    v$process:

    这个视图提供的信息,都是oracle服务进程的信息,没有客户端程序相关的信息
    服务进程分两类,一是后台的,一是dedicate/shared server
    pid, serial#     这是oracle分配的PID
    spid             这才是操作系统的pid
    program          这是服务进程对应的操作系统进程名
    v$session:

    这个视图主要提供的是一个数据库connect的信息,
    主要是client端的信息,比如以下字段:
    machine   在哪台机器上
    terminal  使用什么终端
    osuser    操作系统用户是谁
    program   通过什么客户端程序,比如TOAD
    process   操作系统分配给TOAD的进程号
    logon_time  在什么时间
    username    以什么oracle的帐号登录
    command     执行了什么类型的SQL命令
    sql_hash_value  SQL语句信息

    有一些是server端的信息:
    paddr   即v$process中的server进程的addr
    server  服务器是dedicate/shared

九、Oracle session连接数和inactive的问题记录

十、oracle如何查看当前有哪些用户连接到数据库

十一、筛选统计记录大于2条的数据  

select a.c,a.b from (select t.DEVICE_IMEI c,count(*) as b from device_info t GROUP BY t.DEVICE_IMEI ) a where a.b > 1;

十二、查询字段不是纯数字

SELECT * FROM device_info t WHERE LENGTH(0+t.DEVICE_IMEI) != LENGTH(t.DEVICE_IMEI);//这个原理是0+字段后长度等不等于原长度,但是如果首数字是0的话,就不管用了,例如003,原长度3加零之后,长度变为1
SELECT * FROM device_info t WHERE (t.DEVICE_IMEI REGEXP '[^0-9.]')!=0;

十三、统计所有表的数据量

select t.table_name,t.num_rows from user_tables t ORDER BY NUM_ROWS DESC;

十四、有则更新无则插入

MERGE INTO ali_elec_notice_bill_result a  
USING (  
  SELECT '3536185368' as calcid  
  FROM dual  
  ) b  
ON (a.calcid = b.calcid)  
WHEN MATCHED THEN  
  UPDATE SET a.remark = '已结清清'
WHEN NOT MATCHED THEN  
  INSERT (a.CALCID,a.CUST_NO,a.T_PQ,a.RCVBL_AMT,a.RCVBL_YM,a.REMARK) 
  VALUES ('3536185368','5024002955','236','13216','201903','已结清');  
MERGE INTO ali_elec_notice_query_result a  
USING (  
  SELECT '3140080836' as cust_no,to_date('20190314','yyyyMMdd') as query_date  
  FROM dual  
  ) b  
ON (a.cust_no = b.cust_no and a.query_date = b.query_date)  
WHEN MATCHED THEN  
  UPDATE SET a.custname = '111'
WHEN NOT MATCHED THEN  
  INSERT (a.CUST_NO,a.QUERY_DATE,a.CUSTNAME,a.ADDRESS,a.PREPAY_BAL,a.EXCHG_AMT,a.BATCH_NO,a.ORG_NO,a.ORG_NAME) 
  VALUES ('3140080836',to_date('20190314','yyyyMMdd'),'11','111',116.12,0.00,'34689105721','41412','111');  

十五、查询n到m条数据

SELECT * FROM
             ( 
                 SELECT 表名.*, ROWNUM AS CON FROM 表名 WHERE ROWNUM <= M AND 其它查询条件 ORDER BY 排序条件 
             )
WHERE CON >=N;

十六、----

原文地址:https://www.cnblogs.com/xinzhisoft/p/10098048.html