oracle及pl/sql經常使用記錄

1、複製表或者數據
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
2、清空表

        用truncate、delete均可以清空表中數據。
        SQL以下:
        truncate table [表名];
        delete from [表名];html

        delete與truncate的區別:
        delete:會產生rollback,若是刪除大數據量的錶速度會很慢,同時會佔用不少的rollback segments。
        truncate: 是DDL操做,不產生rollback,速度快。sql

3、PL/SQL的文本導入工具數據庫

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

  文本內第一行寫標題,最好和表相對應,工具會自動識別。詳細內容服務器

4、pl/sql執行一些耗時的操做時,可能會卡住,鼠標會一直轉圈,沒法得知進度,此時能夠另開了個pl/sql,用sql去查看錶的狀態來判斷執行進度。session

  好比一次性導入幾十萬數據的操做,可能須要幾十分鐘分鐘執行,期間你不知道是卡住了仍是正常執行,另起一個pl/sql去count一下數據量,作個簡單的判斷。併發

5、根據rowid刪除重複記錄oracle

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)

6、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';

7、windows下sqlplus管理員無密碼登陸數據庫post

首先,開始菜單,cmd,弄出來黑色窗口

sqlplus /nolog
connect /as sysdba
//賦給用戶鏈接權限
grant create session to username;

8、oracle鏈接數

  在查看數據的鏈接狀況頗有用,寫完程序一邊測試代碼一邊查看數據庫鏈接的釋放狀況有助於分析優化出一個健壯的系統程序來。

  一、查看當前的數據庫鏈接數

     select count(*) from v$process ;    --當前的數據庫鏈接數

  二、數據庫容許的最大鏈接數

     select value from v$parameter where name ='processes';  --數據庫容許的最大鏈接數

  三、修改數據庫最大鏈接數
     alter system set processes = 300 scope = spfile;  --修改最大鏈接數:

  四、關閉/重啓數據庫
     shutdown immediate; --關閉數據庫
     startup; --重啓數據庫

  五、查看當前有哪些用戶正在使用數據 

    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;  --查看當前有哪些用戶正在使用數據

  六、 --當前的session鏈接數 

     select count(*) from v$session  --當前的session鏈接數

  七、當前併發鏈接數

     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

9、Oracle session鏈接數和inactive的問題記錄

10、oracle如何查看當前有哪些用戶鏈接到數據庫

11、篩選統計記錄大於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;

12、查詢字段不是純數字

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;

十3、統計全部表的數據量

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

十4、有則更新無則插入

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');  

十5、查詢n到m條數據

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

十6、----

相關文章
相關標籤/搜索