1、查看當前所有對象

SQL=========>select * from tab                                                     TNAME  (名稱)         TABTYPE    (table|view)

2、建一個和a表結構一樣的空表

SQL >  create table b as select  *  from a where  1 = 2 ;               /*復制表結構但是不復制表中數據*/
                      create table B as select * from A where 1=1;                 /*復制表結構并copy數據*/

SQL
>  create table b(b1,b2,b3) as select a1,a2,a3 from a where  1 = 2



3、顯示當前連接用戶
SQL> show user 

4. 單獨導表操作:
D:\>exp user/pwd@db  file=datazy.dmp tables=(TBL_TRAIN_YEARCENSOR,TBL_TRAIN_EXAMMSG,TBL_TRAIN_ARCHIVES),

5.創建oracle觸發器

ORACLE產生數據庫觸發器的語法為:

create [or replace] trigger 觸發器名 觸發時間 觸發事件 
on 表名 
[for each row] 

其中:

觸發器名:觸發器對象的名稱。由于觸發器是數據庫自動執行的,因此該名稱只是一個名稱,沒有實質的用途。
觸發時間:指明觸發器何時執行,該值可取:
   before---表示在數據庫動作之前觸發器執行;
   after---表示在數據庫動作之后出發器執行。

觸發事件:指明哪些數據庫動作會觸發此觸發器:
   insert:數據庫插入會觸發此觸發器;
   update:數據庫修改會觸發此觸發器;
   delete:數據庫刪除會觸發此觸發器。

表 名:數據庫觸發器所在的表。

for each row:對表的每一行觸發器執行一次。如果沒有這一選項,則只對整個表執行一次。

舉例:下面的觸發器在更新表auths之前觸發,目的是不允許在周末修改表:
create trigger auth_secure 
before 
insert or update or delete //對整表更新前觸發 
on auths 
begin 
if(to_char(sysdate,'DY')='SUN' 
RAISE_APPLICATION_ERROR(
-20600,'不能在周末修改表auths'); 
end if
end 

下面的列子是在數據庫加入數據的時候自動增加ID序列
create or replace trigger EPP_INNER_AUDIT_TID
before 
insert
on EPP_INNER_AUDIT_TABLE for each row
declare
    id_seq    
varchar2(20);
begin
    
select trim(to_char(EPP_SEQ_INNER_AUDIT_ID.nextval ,'0999999')) into id_seq from dual;
    :new.audit_id :
= id_seq;
    :new.operate_date :
= sysdate;
end;


6.創建oracle存儲過程

oracle創建存儲過程的語法為:

CREATE OR REPLACE PROCEDURE 存儲過程名字
(
    參數1 
IN NUMBER,
    參數2 
IN NUMBER
IS
變量1 
INTEGER :=0;
變量2 DATE;
BEGIN
END 存儲過程名字

   SELECT INTO STATEMENT
  將select查詢的結果存入到變量中,可以同時將多個列存儲多個變量中,必須有一條
  記錄,否則拋出異常(如果沒有記錄拋出NO_DATA_FOUND)

 

BEGIN
  
SELECT col1,col2 into 變量1,變量2 FROM typestruct where xxx;
  EXCEPTION
  
WHEN NO_DATA_FOUND THEN
      xxxx;
  
END;
  

IF 判斷

IF V_TEST=1 THEN
    
BEGIN 
       do something
    
END;
  
END IF;

while 循環

WHILE V_TEST=1 LOOP
  
BEGIN
 XXXX
  
END;
  
END LOOP;

變量賦值
 

 V_TEST := 123;


舉例:
添加新用戶存儲過程AddUser 

CREATE Procedure AddUser
 (
     
@UserName   nvarchar(50),
     
@Password   nvarchar(50),
     
@Name   nvarchar(50),
     
@Email    nvarchar(50),
     
@Sex  nvarchar(50),
     
@IDCardNumber   nvarchar(50),
    
@Telephone   nvarchar(50),
    
@Address nvarchar(50),
    
@Zipcode nvarchar(50),
    
@Problem nvarchar(50),
    
@Answer nvarchar(50),
   
/**//* @Integral float(8), */
    
@UserID int OUTPUT
)
AS    
    
/**//*檢查是否存在相同的userName*/
     
if(not exists(select * from UserInfo where UserName=@UserName))
    
BEGIN 
        
/**//*不存在則插入新記錄,否則返回-1*/
        
INSERT INTO UserInfo(UserName,Password,Name,Email,Sex,IDCardNumber,
                Telephone,Address,Zipcode,Problem,Answer)
            
VALUES(@UserName,@Password,@Name,@Email,
               
@Sex,@IDCardNumber,@Telephone,@Address,
                
@Zipcode,@Problem,@Answer
            
SELECT @UserID=@@identity
    
END
    
ELSE  BEGIN 
        
SET @UserID=-1
    
END

GO


定期執行的存儲過程

create or replace procedure checkpoint_pro
(
       p_registrar_id       
in VARCHAR2,  -- 注冊商id
       p_operator_id        in VARCHAR2,  -- 清算操作人員id
       p_checkDate          in varchar2,  -- 要進行清算的數據的日期
       p_result             out varchar2  -- 清算返回結果
)
is
       v_deal_id           
varchar2(7);
       v_Money             
NUMBER := 0;  -- 清算的費用
       v_Count             number := 0;  -- 清算的記錄數
       v_last_expend_id    number := 0;
       pre_available_fee   
number := 0;  -- 清算前余額
       post_available_fee  number := 0;  -- 清算后余額
       last_check_date     date ;        --最后一次清算日期
       dealdate            varchar2(20); --循環清算中某一次的清算日期
       is_second           varchar2(7);  --是否是二次清算
begin

     p_result :
= 'true';
     is_second :
= 'false';
     
     
--查找注冊商最后一次清算日期
     select max(DEAL_DATE) into last_check_date
     
from rn_registry.rn_day_deal_table where registrar_id = p_registrar_id;

     
--如果最后一次清算日期等于當前要清算的日期,則標記為二次清算
     if last_check_date is not null and to_char(last_check_date,'yyyy-mm-dd'= substr(p_checkDate,0,10)  then
        is_second :
= 'true';
     
end if;

     
--從最后一次清算日期開始按天循環清算,直到等于當前要清算的日期
     while to_char(last_check_date,'yyyy-mm-dd'< substr(p_checkDate,0,10or is_second = 'true' or last_check_date is null loop
          
--取得本次循環清算的清算日期
          if is_second = 'true' or last_check_date is null then
             dealdate :
= p_checkDate;
             is_second :
= 'false';
          
else
           dealdate :
= to_char(last_check_date+1,'yyyy-mm-dd')||' 00:00';
          
end if;

        
begin
               savepoint DOMAIN_CHECK;
               
-- 給處理過的數據加標記,保證數據在下次計算時不會被第二次計算
               select trim(to_char(rn_registry.RN_SEQ_DEAL_ID.nextval,'0999999')) into v_deal_id from dual;
               
update rn_registry.rn_renew_log_table
               
set    check_flag = 'true',deal_id = v_deal_id
               
where  registrar_id = p_registrar_id
               
and    to_char(renew_date,'yyyy-mm-dd hh24:mi'<dealdate
               
and    check_flag = 'false';

               
-- 計算要清算的費用總數
               select count(*), nvl(sum(price * renew_year),0into v_Count, v_Money
               
from   rn_registry.rn_renew_log_table
               
where  registrar_id = p_registrar_id
               
and    deal_id = v_deal_id;
             
               
select avaliable_fee into pre_available_fee from rn_registry.rn_registrar_day_fee_table where registrar_id=p_registrar_id;
               post_available_fee :
=  pre_available_fee - v_Money;
               
--判斷余額是否能夠支付本次清算
               --if    post_available_fee < 0  then
           --    p_result := 'false';
           --    rollback to savepoint DOMAIN_CHECK;
           --    goto end_one_check;                   
               --end if;

               
-- 更新注冊端余額
           update rn_registry.rn_registrar_day_fee_table set avaliable_fee = avaliable_fee - v_Money where registrar_id=p_registrar_id;

               
-- 向注冊端每日清算表中插入清算結果
               insert into rn_registry.rn_day_deal_table (deal_id,deal_date,registrar_id,expendition,count)
                 
values(v_deal_id, to_date(dealdate,'yyyy-mm-dd hh24:mi'), p_registrar_id, v_Money, v_Count);

               
-- 向費用端每日消費表中插入消費結果
               insert into rn_registrar_expend_table (deal_id,operator_id,deal_date,amount,pre_available_fee,post_available_fee,expend_id,registrar_id)
                 
values(v_deal_id, p_operator_id, to_date(dealdate,'yyyy-mm-dd hh24:mi'), v_Money, pre_available_fee, post_available_fee, null, p_registrar_id);

               
-- 更新費用端余額
               select expend_id into v_last_expend_id from rn_registrar_expend_table where deal_id = v_deal_id and registrar_id = p_registrar_id;
               
update rn_registrar_fee_table set available_fee = available_fee - v_Money,last_expend_id = v_last_expend_id where registrar_id=p_registrar_id;

               
commit;
           
<<end_one_check>>
           
null;
         exception
              
when others then
               p_result :
= 'false';
               
rollback to savepoint DOMAIN_CHECK;
         
end;

       
exit when p_result = 'false';

       
--查找注冊商最后一次清算日期
         select max(DEAL_DATE) into last_check_date
         
from rn_registry.rn_day_deal_table where registrar_id = p_registrar_id;
     
end loop;

exception
   
when others then
        p_result :
= 'false';

end checkpoint_pro;


 7.查詢當前用戶權限

select * from session_privs;