⑴ LINUX下,對ORACLE資料庫腳本(比如存儲過程或是觸發器)進程編譯,用哪個命令
sqlplus里
@${filename}
showerror -- 查看編譯錯誤
⑵ oracle 觸發器
CREATE OR REPLACE TRIGGER insert_trigger
AFTER INSERT ON emp
DECLARE
CURSOR c_rows IS
SELECT 'id',salary from emp;
BEGIN
for c_each_row in c_rows loop
if c_each_row.salary<0 THEN
update emp set salary=0 where id=c_each_row.id;
else if c_each_row.salary>10000 THEN
update emp set salary=10000 where id=c_each_row.id;
end if;
end loop;
END insert_trigger;
⑶ Oracle的觸發器怎麼寫
我以前做的一個例子,你參考下吧
第八章 觸發器(Trigger)
--格式:
create or replace trigger 名稱
[after|before][delete|update|insert]
[on 表 | on schema]
[referencing new as 別名 old as 別名]
[for each row]
declare
....
begin
...
exception
....
end;
--創建一個delete類型行級觸發器
--刪除的一行數據保存在:old
create or replace trigger emp_delete_row_trigger
after delete
on emp
referencing new as n old as o
for each row
begin
dbms_output.put_line('emp_delete_row_trigger called.');
dbms_output.put_line('刪除員工:' || :o.empno || ' ' || :o.ename);
end;
delete from emp where empno=7499;
delete from emp;
--創建一個insert類型行級觸發器
--插入的一行新數據保存在:new
create or replace trigger emp_insert_row_trigger
after insert
on emp
for each row
begin
dbms_output.put_line('emp_insert_row_trigger called.');
dbms_output.put_line('添加員工:' || :new.empno || ' ' || :new.ename);
end;
insert into emp(empno,ename) values(1,'empxxx');
--創建一個update類型行級觸發器
--修改前的數據保存在:old
--修改後的數據保存在:new
create or replace trigger emp_update_row_trigger
after update
on emp
for each row
begin
dbms_output.put_line('emp_update_row_trigger called.');
dbms_output.put_line('修改前:' || :old.empno || ' ' || :old.ename);
dbms_output.put_line('修改後:' || :new.empno || ' ' || :new.ename);
end;
update emp
set ename='xxxx'
where empno=7499;
--語句級觸發器(update,delete,insert)
create or replace trigger delete_stmt_trigger
after delete
on emp
begin
dbms_output.put_line('delete_stmt_trigger called.');
end;
delete from emp;
--判斷觸發器類型
----------------------------------------------------------
--每進行一次交易,就要調用觸發器,自動扣除或增加賬戶金額
----------------------------------------------------------
create table account
(
customerName varchar2(30) primary key,
cardID varchar2(8),
currentMoney number
);
insert into account values('Daivd','10010001',5000);
insert into account values('Jason','10010002',3000);
create table trans
(
transDate date,
cardID varchar2(8),
transType varchar2(10),
transMoney number
);
insert into trans
values(sysdate,'10010001','取款',1000);
create or replace trigger trans_trigger
before insert
on trans
for each row
declare
v_currentMoney account.currentMoney%type;
begin
--判斷類型
if :new.transType='取款' then
--取款
select currentMoney into v_currentMoney
from account
where cardID=:new.cardID;
if v_currentMoney < :new.transMoney then
raise_application_error(-20001,'余額不足');
end if;
update account
set currentMoney=currentMoney-:new.transMoney
where cardID=:new.cardID;
else
--存款
update account
set currentMoney=currentMoney+:new.transMoney
where cardID=:new.cardID;
end if;
exception
when no_data_found then
raise_application_error(-20002,'無效的帳戶');
end;
--模式(schema)級觸發器
create or replace trigger schema_trigger
before drop
on schema
begin
dbms_output.put_line('schema_trigger called');
dbms_output.put_line(ora_dict_obj_name);
dbms_output.put_line(ora_dict_obj_type);
if ora_dict_obj_name='ACCOUNT' then
raise_application_error(-20003,'ACCOUNT表不能被刪除');
end if;
end;
drop table account;
--ora_dict_obj_name 操作對象名稱
--ora_dict_obj_type 操作對象類型
--啟用觸發器
alter trigger schema_trigger enable;
--禁用觸發器
alter trigger schema_trigger disable;
⑷ Oracle如何創建觸發器
一般在sqlplus或者其他第三方oracle工具中,按照語法及需求寫好代碼,直接執行創建過程即可。
一般語法如下:
CREATE[ORREPLACE]TRIGGERtrigger_name
{BEFORE|AFTER}
{INSERT|DELETE|UPDATE[OFcolumn[,column…]]}
[OR{INSERT|DELETE|UPDATE[OFcolumn[,column…]]}...]
ON[schema.]table_name|[schema.]view_name
[REFERENCING{OLD[AS]old|NEW[AS]new|PARENTasparent}]
[FOREACHROW]
[WHENcondition]
PL/SQL_BLOCK|CALLprocere_name;
⑸ 在ORACLE中設置觸發器的具體步驟
參考資料 中為 Oracle 創建觸發器的一些例子。
⑹ oracle建立觸發器 success with compilation error
1、oracle資料庫中的觸發器,insert into users values('05','trigger','普通','trigger','擁有一般許可權');。
⑺ 求一個oracle觸發器的寫法:
這個我知道,因為我也犯過類似的錯誤,其實本身創建觸發器語句沒什麼錯誤。但是因為你是在SQL窗口下運行這些代碼就會出現編譯錯誤,那麼如果你換一個窗口--比如命令窗口(oracle 10g)這樣呢創建觸發器,函數,過程就都不會游編譯錯誤了
⑻ oracle創建的觸發器帶有編譯錯誤
告訴你兩點:
1、當出現警告或者錯誤的時候,使用show error 命令,可以查看錯誤的具體信息,在信息中可以定位錯誤的具體位置。
2、你的問題是:【endif;】不能寫在一起,【end if;】是正確的。
類似的還有【end loop】 等。
---
以上,希望對你有所幫助。
⑼ Oracle存儲過程觸發器用法
1:什麼叫存儲過程?
在oracle中,可以在資料庫中定義子程序,這種程序塊叫存儲過程(procere),它存放在數據字典中,可以在不同用戶和應用程序中共享,並可以實現程序的優化和重用。
2:存儲過程的有點?
過程運行在伺服器端,執行速度快
過程執行一次後代碼就駐留在高速緩存中,在以後的操作中,直接調用緩存數據。
確保資料庫的安全性,可以不授權用戶直接訪問應用程序中的一些表,而是授權用戶執行訪問資料庫的過程。
自動完成需要預先執行的任務,過程可以在系統啟動時自動運行。、
3:存儲過程的創建和執行
用戶存儲過程只能定義在當前資料庫中,可以使用sql語句或OEM創建。
默認情況下,用戶創建的存儲過程歸登錄資料庫的用戶所擁有,DBA可以把許可授權給其他用戶。
Sql命令創建存儲過程
CREATEprocere過程名
【(parameterparameter_modedate_type,….n)】
IS|AS
BEGIN
SQL_STATEMENT
END過程名
其中
Parameter表示過程的參數。
parameter_mode:參數的類型,過程參數和函數參數一樣,有三種類型IN,OUT,INOUT
IN表示參數是輸入給過程的。
OUT表示採納數載過程中被賦值,可以傳給過程的外部。
INOUT表示可以傳內,可以傳外。
調用存儲過程
直接輸入存儲過程的名字可以執行一個已經定義的存儲過程。
存儲過程的編輯修改
修改存儲過程雖然可以和修改視圖一樣,用ALTERprocere,但是他是用來重新編譯和驗證用的,如果要修改過程定義,建議還是用createorreplace。
存儲過程的刪除
當某個過程不再需要的時候,應該將其從內存中刪除,以釋放它佔用的資源。
Dropprocere存儲過程名。
Dropprocereupdate_info.
觸發器
觸發器(trigger)是一些過程,與表聯系緊密,用於保護表中的數據,當一個基表被修改時,觸發器自動就會執行。例如出入其可以實現多個表間數據的一致性和完整性。
一般情況下,對表數據的操作有增刪查改,維護數據的觸發器也可以分為多種,每張基表最多可以建立12個觸發器。
1:Beforeinsert2:beforeinsertfoeachrow;3:afterinert
4:afterinsertforeachrow5:beforeupdate6:beforeupdateforeachrow
7:afterupdate8:afterupdateforeachrow;9:beforedelete;
10:beforedeleteforeachrow11:afterdelete12:afterdeleteforeachrow.
利用sql語句創建觸發器
語法規則
Createorreplacetrigger觸發器名
{before|after|insteadof}
{delete【orinsert】【orupdate】【ofcolumn….n】}
On表名|視圖名
【foreachrow】[]wherecondition]]
Sql_statement[,,,n]
參數說明
Insteadof:指定在創建替代觸發器。
Ofcolumn指定在哪些列上進行觸發。。。
創建觸發器的限制
1:觸發器中有效的語句可以包括DML語句,但是不能包括DDL,rollback,commit
,savepoint都不適用。
⑽ 求一個簡單的oracle 觸發器 寫法
創建兩個表:
createtablea
(stdidint,
stdnamevarchar2(10));
createtableb
(stdidint,
stdnamevarchar2(10));
創建觸發器:
CREATEORREPLACETRIGGERtr_insert
afterinsert
ONa
FOREACHROW
BEGIN
INSERTINTOb(stdid,stdname)
VALUES(:new.stdid,:new.stdname);
END;
驗證,在a表中插入數據:
insertintoavalues(1,'a');
commit;
驗證b表結果: