Oracle複製表和儲存過程編寫注意事項
- 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
- 編寫儲存過程一些注意細節和技巧
- 給儲存過程變數賦值
- 定義一個變數:v_temp_hour varchar2(20);
- 給變數賦值:
方式一:v_temp_hour:='21';
方式二:select to_char(sysdate,'hh24') into v_temp_hour from dual;
說明:方式一是直接給字串變數賦值,方式二是通過查詢sql給變數賦值
- 儲存過程中執行存在變數的sql語句
注意:需要使用 execute immediate 執行sql
- 儲存過程中變數拼接使用'||',判斷兩個字串是否相等用'='
- 儲存過程中sql 中單引號轉義,再加一個單引號,如下
- 儲存過程中使用邏輯判斷
注意:
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下安裝CentOS和Ubuntu過程中注意事項
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 Developer和oracle中如何新建儲存過程並呼叫儲存過程
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