1. 程式人生 > >Oracle複製表和儲存過程編寫注意事項

Oracle複製表和儲存過程編寫注意事項

  1. Oracle中複製表或者複製表結構

1. 複製表結構及其資料:

create table table_name_new as select * from table_name_old

2. 只複製表結構(後面加where條件)

create table table_name_new as select * from table_name_old where 1=0;

或者:

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

  1. 編寫儲存過程一些注意細節和技巧
  1. 給儲存過程變數賦值
    1. 定義一個變數:v_temp_hour varchar2(20);
    2. 給變數賦值:

      方式一:v_temp_hour:='21';

      方式二:select to_char(sysdate,'hh24') into v_temp_hour from dual;

說明:方式一是直接給字串變數賦值,方式二是通過查詢sql給變數賦值

  1. 儲存過程中執行存在變數的sql語句

注意:需要使用 execute immediate 執行sql

  1. 儲存過程中變數拼接使用'||',判斷兩個字串是否相等用'='
  2. 儲存過程中sql 中單引號轉義,再加一個單引號,如下

  3. 儲存過程中使用邏輯判斷

    注意:

    if 條件 then

         邏輯處理

    elsif 條件 then

    邏輯處理

    elsif 條件 then

    邏輯處理

    else

    邏輯處理

    end if;

    6、儲存過程例項

CREATE OR REPLACE PROCEDURE from_celltemp_to_cell IS

v_temp_hour varchar2(20);

v_temp_week varchar2(20);

v_table_name_hour varchar2(50);

v_table_name_week varchar2(50);

v_cell_max_time varchar2(20);

v_sysdate_time varchar2(20);

v_sql varchar2(200);

v_insert_cell_sql varchar2(2000);

v_truncate_cell_sql varchar2(1000);

v_truncate_cell_temp_sql varchar2(2000);

BEGIN

-- 查詢當前系統時間,獲得小時

select to_char(sysdate,'hh24') into v_temp_hour from dual;

-- 根據小時判斷遷移哪張分割槽表

if v_temp_hour='00' or v_temp_hour='01' or v_temp_hour='02' or v_temp_hour='03' then

v_table_name_hour := 'M_CELL_TEMP_part20_23';

elsif v_temp_hour='04' or v_temp_hour='05' or v_temp_hour='06' or v_temp_hour='07' then

v_table_name_hour := 'M_CELL_TEMP_part00_03';

elsif v_temp_hour='08' or v_temp_hour='09' or v_temp_hour='10' or v_temp_hour='11' then

v_table_name_hour := 'M_CELL_TEMP_part04_07';

elsif v_temp_hour='12' or v_temp_hour='13' or v_temp_hour='14' or v_temp_hour='15' then

v_table_name_hour := 'M_CELL_TEMP_part08_11';

elsif v_temp_hour='16' or v_temp_hour='17' or v_temp_hour='18' or v_temp_hour='19' then

v_table_name_hour := 'M_CELL_TEMP_part12_15';

elsif v_temp_hour='20' or v_temp_hour='21' or v_temp_hour='22' or v_temp_hour='23' then

v_table_name_hour := 'M_CELL_TEMP_part16_19';

else

dbms_output.put_line('error!');

end if;

-- 查詢當前系統時間,獲得星期幾

select replace(to_char(sysdate,'day','nls_date_language=american'),' ','') into v_temp_week from dual;

-- 根據星期幾判斷刪除哪張分割槽表

if v_temp_week='monday' then

v_table_name_week := 'M_CELL_total_mon';

elsif v_temp_week='tuesday' then

v_table_name_week := 'M_CELL_total_tue';

elsif v_temp_week='wednesday' then

v_table_name_week := 'M_CELL_total_wed';

elsif v_temp_week='thursday' then

v_table_name_week := 'M_CELL_total_thu';

elsif v_temp_week='friday' then

v_table_name_week := 'M_CELL_total_fri';

elsif v_temp_week='saturday' then

v_table_name_week := 'M_CELL_total_sat';

elsif v_temp_week='sunday' then

v_table_name_week := 'M_CELL_total_sun';

else

dbms_output.put_line('error!');

end if;

-- 檢視cell表某個分割槽的日期是否是上週資料

--cell表最大時間

v_sql:='select to_char(max(createtime),''yyyy-mm-dd'') from m_cell partition('||v_table_name_week||')';

EXECUTE IMMEDIATE v_sql into v_cell_max_time ;

--系統時間

select to_char(sysdate,'yyyy-mm-dd') into v_sysdate_time from dual;

if v_cell_max_time is not null and v_cell_max_time!=v_sysdate_time then

-- 刪除cell表中的某一個分割槽的資料

v_truncate_cell_sql:='ALTER TABLE m_cell TRUNCATE PARTITION '||v_table_name_week;

EXECUTE IMMEDIATE v_truncate_cell_sql;

end if;

-- cell表中遷移資料

v_insert_cell_sql:='insert into m_cell

(ttime, service_type, ne_name, lac, ci, noservicetime, old_value, current_value, nosignaltime, old_rejtimes, old_successtimes, old_successrate, rejtimes, successtimes, successrate, monitor_notes, param_extral, createtime, id, state_type, monitor_type, confirm_time, cancel_time, keyvalue)

select ttime, service_type, ne_name, lac, ci, noservicetime, old_value, current_value, nosignaltime, old_rejtimes, old_successtimes, old_successrate, rejtimes, successtimes, successrate, monitor_notes, param_extral, createtime, sys_guid(), state_type, monitor_type, confirm_time, cancel_time,

replace(to_char(createtime,''day'',''nls_date_language=american''),'' '','''')

from m_cell_temp partition('||v_table_name_hour||')';

EXECUTE IMMEDIATE v_insert_cell_sql;

-- 刪除cell_temp表中的某一個分割槽的資料

v_truncate_cell_temp_sql:='ALTER TABLE m_cell_temp TRUNCATE PARTITION '||v_table_name_hour;

EXECUTE IMMEDIATE v_truncate_cell_temp_sql;

commit;

END from_celltemp_to_cell;

相關推薦

Oracle複製儲存過程編寫注意事項

Oracle中複製表或者複製表結構 1. 複製表結構及其資料:create table table_name_new as select * from table_name_old 2. 只複製表結構(

MS-SQL2000中修改儲存過程的所有者

昨天從客戶那拿一個數據庫來測試,客戶那邊資料表的所有者為msuser,我在本機匯入後一部分表變成了dbo,我要將它們改為dbo所有,找了好久,都說是"右擊表"-->"設計表"-->"右擊滑鼠"-->"屬性",然後在"所有者"欄中個性。我這個資料庫有幾十個表,

刪除指定SQL資料庫所有儲存過程

原理就是根據 sysobjects 系統表裡面查到每張表名,然後drop掉,同理可以一次性drop所有儲存過程 --刪所有資料表 USE [資料庫名] DECLARE @tableName VARCH

Virtualbox下安裝CentOSUbuntu過程注意事項

1、Virtualbox下安裝CentOS過程中的注意事項: (1)在安裝Oracle VM VirtualBox的時候一定要保證安裝目錄的磁碟空間至少要大於你分配虛擬空間,保證安裝過程有足夠的磁碟空間。一般建議8-10G。如果安裝過程出現如下圖所示錯誤ID:BLKCACH

py呼叫oracle儲存過程注意procedure的out取值方式

#!/usr/bin/env python import sys import csv import cx_Oracle import codecs import os os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.ZHS16GBK'

在PL/SQL Developeroracle中如何新建儲存過程並呼叫儲存過程

1、新建程式視窗,選擇Procedure 2、寫入procedure以後,要執行程式進行編譯 3、編譯成功以後,有三種方法可以執行procedure 第一種是在命令視窗執行exec procedure name SQL> exec procedure_name();

簡單瞭解一下oracle中的顯示遊標儲存過程

遊標   遊標主要分兩類動態和靜態遊標,靜態遊標是編譯時知道明確的select語句的遊標,靜態遊標分類兩種,顯示遊標和靜態遊標,這裡只說顯示遊標 顯示遊標 declare name emp.ename%type; sal emp.sal%type; --宣

資料庫第八次作業建儲存過程檢視舉例

1)用DDL寫出Booking表的定義,包括主鍵,外來鍵,域約束。** 主鍵由三個欄位組成,外來鍵來自多個表,分開寫更清晰, 域約束用check來限制,另外一種方法是用Domain,在建表之前就限制 CREATE TABLE Booking( hotelNo I

Oracle 函式儲存過程的區別聯絡 總結版

  oracle儲存過程與函式的區別 2017年08月15日 22:49:38 冷月葬花魂iiii 閱讀數:7800更多 個人分類: oracle 定義: 儲存過程(Stored Procedure )是一組為了完成特定功能的SQL 語句集

ORACLE定時任務呼叫儲存過程動態為新增分割槽

1、建立需要自動分割槽的表 CREATE TABLE TEST(M DATA) PARTITION BY RANGE(M) ( PARTITION TEST_PAR_99991212 VALUES LESS THAN(TO_DATE('12-12-9999','DD-MM-

MySql 定時任務儲存過程,每月建立一張

最近用MySQL做了一個每月1號00:00:00建立一張表並將上個月的表資料匯入到新建立的表中,在此做個小記。 1. 要做這個之前先要: -- 設定好時區 set time_zone

使用oracle function儲存過程返回單個值

1 function 返回值 function get_link_coalingid(p_id in varchar2 ) return varchar2  is          r_lid             varchar2(200);    begin     

oracle批量備份儲存過程

在一些重大變更前,後都需要備份涉及的重要表,當表很多且備份不是最新的時候,需要drop表,因為oracle沒if exists 這種語法,寫個儲存過程來批量備份,當然也可以把加上引數,不過沒什麼必要,基本知道哪些表需要備份,執行下儲存過程就OK 注意,這邊如果當天存在同名備

oracle查詢使用者,函式,儲存過程,

   ◆Oracle查詢使用者表空間:select * from user_all_tables   ◆Oracle查詢所有函式和儲存過程:select * from user_source   ◆Oracle查詢所有使用者:select * from all_users.select * from dba_

使用type型別儲存過程來完成oracle的行列轉換

  create or replace type obj_table1 as object( id varchar2(3), name varchar2(10) ); create or replace type tbl_table1 as table of obj_ta

Oracle用定時任務儲存過程將資料轉存到歷史,提高查詢速度

一、定義儲存過程 CREATE OR REPLACE PROCEDURE Sync_INFO_HISTORY IS BEGIN insert into depart_passenger_info

ORACLE建立包包體及包中函式儲存過程

背景:在Oracle資料庫建立包,在包建立函式Function和儲存過程Procedure。在java專案中呼叫。 建立包,並在下面宣告包含的函式和儲存過程: create or replace p

MySQL任務排程儲存過程實現實時修改中欄位值

DELIMITER $$USE `wqd_zw_platform`$$DROP PROCEDURE IF EXISTS `update_activity_state`$$CREATE DEFINER=`root`@`localhost` PROCEDURE `update_activity_state`()B

oracle 觸發器儲存過程簡單例子

1 觸發器  create or replace trigger testdta.trriger_f03b11----testdta是表空間   after insert or update on testdta.f03b11   for each row--行級觸發器

MySQL利用自定義函式儲存過程建立海量,並使用索引優化

昨天學習韓順平老師的視訊時明白了上一章explain的意義,為了自己的聯絡,我學著建立了一個海量表,供自己練習使用。 程式碼如下: #建立表DEPT CREATE TABLE dept( /*部門表*/ deptno MEDIUMINT UN