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,10) or 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),0) into 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;
|