I 書寫定義sql1.1 DQL語言必須寫into關鍵字查詢語句只能有一條返回值
異常示例:
沒有值 ;
值過多
1.2 DML(//)
執行DML語句要處理事務
&+變量來實現動態傳參
--執行DML語句
declare
begin
????--普通DML語句
????delete?from?emp?where?empno=&xx;
????--事務處理
????commit;
end;
1.3 DDL(/drop/alter/)
('DDL')
??declare
????v_count?number(3);
??begin
????select?count(*)?into?v_count?from?user_tables?where?table_name='T_TEST';
????if?v_count=1?then
????--DDL語句執行時execute?immediate()
????execute?immediate('drop?table?t_test');
????dbms_output.put_line('drop?table?success');
????end?if;
????
????execute?immediate('create?table??t_test(id?number(10),name?varchar2(20))');
????dbms_output.put_line('create?table?success');
??end;
II 游標()
sql語句執行時會在內存中開辟一個區域sql數據庫文件類型,用來存放執行的sql語句以及返回的數據,我們把這個內存區域叫做上下文環境();游標就是指向這個上下文環境的指針。
2.1 游標分類2.2 游標的屬性
% 存儲的是游標執行時所影響的記錄條數
2.3 操作屬性
???declare
??????????v_count?binary_integer;
???begin
??????????update?emp?set?job='baobiao'?where?empno=1111;
??????????--操作隱式游標的屬性獲得影響的記錄數
??????????v_count?:=?sql%rowcount;
??????????commit;
??????????
??????????dbms_output.put_line(v_count||'?rows?updated');
???end;
2.4 顯示游標創建游標 游標名稱 is 查詢語句開啟游標open 游標名稱獲取數據fetch 游標名稱 into 變量關閉游標close 游標名稱
???declare
??????????v_name?varchar2(20);
??????????v_job?varchar2(20);
??????????--定義游標
??????????cursor?my_cursor?is?select?ename,job?from?emp;
???begin
??????????--開啟游標,執行sql語句,將結果存儲在指定內存區域
??????????open?my_cursor;
??????????
??????????loop
??????????--獲取數據,給變量賦值
??????????fetch?my_cursor?into??v_name,v_job;
??????????dbms_output.put_line(v_name||'-----'||v_job);
??????????
??????????exit?when?my_cursor%notfound;
??????????
??????????end?loop;
??????????--關閉游標
??????????close?my_cursor;
???end;
循環游標
???--for循環
???declare
??????????cursor?my_cursor?is?select?*?from?emp;
???begin
??????????for?v_c?in?my_cursor?loop
????dbms_output.put_line(v_c.ename||'---'||v_c.job);
??????????end?loop;
???end;
定義游標時傳遞參數
???--定義含有參數的游標
???declare
??????????v_emp_record?emp%rowtype;
??????????--定義含有參數的游標
??????????cursor?my_cursor(p_id?number)?is?select?*?from?emp?where?empno=p_id;
???begin
??????????--通過動態方式傳遞參數
??????????open?my_cursor(&no);
??????????loop
??????????fetch?my_cursor?into?v_emp_record;
??????????exit?when?my_cursor%notfound;
??????????dbms_output.put_line(v_emp_record.ename||v_emp_record.empno);
??????????end?loop;
??????????close??my_cursor;
???end;
注意:
設置形參時不要寫參數的長度,實參是在開啟游標的時候傳遞。游標不能重復開啟和關閉2.5 定義游標類型的變量
定義游標類型:type 游標類型名稱 is ref 返回結果類型
定義游標類型的變量: 變量名稱 游標類型名稱
declare
??????????--定義游標類型
??????????type?cursor_type?is??ref?cursor?return?emp%rowtype;
??????????--定義游標類型變量
??????????my_cursor?cursor_type;
??????????my_record?emp%rowtype;
???begin
??????????--在開啟游標的時候動態綁定sql
??????????open?my_cursor?for?select?*?from?emp;
??????????loop
??????????--循環游標變量,把結果存放在記錄類型的變量中
??????????fetch?my_cursor?into?my_record;
??????????exit?when?my_cursor%notfound;
??????????dbms_output.put_line(my_record.ename||my_record.empno);
??????????end?loop;
???end;
III 過程和函數
IV 觸發器 ()
類似java中的觸發器由數據庫管理系統負責調用和執行,通過觸發觸發器所監聽的事物來實現觸發器的調用。
/*表級觸發器*/
create?or?replace?trigger?table_emp_trigger
before??delete?or?update?or?insert?on?emp?
begin
???????if?to_char(sysdate,'dy')?in('星期二','星期三')then
??????????
??????????dbms_standard.raise_application_error(-20000,'u?cant?modify?this?table');
???????end?if;
?
end;
?
?
/*行級的觸發器*/
create?or?replace?trigger?update_sal_emp_trigger
before?update?on?emp?for?each?row
begin
???????--:old.字段??獲取更新之前的舊值
???????--:呢w.字段??獲取更新之后的新值
???????if?:old.job?not?in('MANAGER','PRESIDENT')?and?:new.sal>10000?then
??????????dbms_standard.raise_application_error(-20001,'u?have?too?many?money');
???????end?if;
end;
?
?
/*同步my_emp和emp表的插入*/
?
?
?
create?or?replace?trigger?insert_emp_trigger
after?insert?on?emp?for?each?row
begin
???????--:old.字段??獲取更新之前的舊值
???????--:new.字段??獲取更新之后的新值
???????insert?into?my_emp(empno)?values(:new.empno);
?????????
end;
?
update?emp?set?sal=10001?where?empno=7389;
select?*?from?my_emp;
drop?trigger?table_emp_trigger;
insert?into?emp(empno,ename)?values(1119,'xx');
commit;
4.1 觸發器的執行順序
有表級別的觸發器,行級別的觸發器作用于同一個表
表級別觸發器 行級別觸發器after 行級別觸發器after 表級別觸發器4.2 系統觸發器
DBA用來調試系統on
注:觸發器不帶參數,沒有放回值,不作事務處理。
V 預備知識5.1 使用SQL*PLUS登陸遠程數據庫的配置
DEV?=
??(DESCRIPTION?=
????(ADDRESS_LIST?=
??????(ADDRESS?=?(PROTOCOL?=?TCP)(HOST?=?12.11.11.11)(PORT?=?1521))
????)
????(CONNECT_DATA?=
??????(SERVICE_NAME?=?ios逆向11on11)
????)
??)
5.2 建立數據庫
CREATE?DATABASE?database;
5.3 建立順序號
CREATE?SEQUENCE?CINOSEQ?MINVALUE?1?MAXVALUE?4000000000?START?WITH?41?INCREMENT?BY?1?NOCYCLE;
5.4 創建索引
CREATE?[?UNIQUE?]?INDEX?index
ON?table?"("
?????column?[?ASC?|?DESC]
??[,?column?[?ASC?|?DESC]]...?")"?;
5.5 修改表
ALTER?TABLE?表名?ADD?字段名?字段名描述???[?DEFAULT?expr?][?NOT?NULL?][?,字段名2?……];
ALTER?TABLE?表名?MODIFY?字段名1?字段名1描述??[?DEFAULT?expr?][?NOT?NULL?][?,字段名2?……];
ALTER?TABLE?表名?DROP?字段名;
ALTER?TABLE?表名?ADD?|?DISABLE?|?ENABLE?CONSTRAINT?約束名?PRIMARY?KEY?(字段名1[,字段名2?……]);
ALTER?TABLE?表名?ADD?|?DISABLE?|?ENABLE?CONSTRAINT?約束名?UNIQUE?(字段名1[,字段名2?……]);
ALTER?TABLE?表名?DROP?CONSTRAINTS?約束名?[CASCADE];
--會把約束相關的索引一起刪除,CASCADE能同時刪去外鍵的約束條件。
DROP?INDEX?索引名;
DROP?SEQUENCE?順序名;
DROP?TABLE?表名?[{CASCADE?|?CASCADE?CONSTRAINTS?|?RESTRICT}]?;
5.6 查詢
5.7 插入數據
使用語句一次只能插入一行數據。
INSERT?INTO?{?table?|?view?}?["("column?[,?column]...")"]{?VALUES?"("?expression[,?expression]...")"?|?subquery?};
5.8
在修改表中數據時sql數據庫文件類型,不能破環表的完整性約束。如果修改的數據與完整性約束有沖突,那么這種修改操作不能成功。
UPDATE?{?table?|?view?}?[?alias?]?SET?column?=?{?expression?|?subquery?}?[,?column?=?{?expr?|?subquery?}]...[WHERE?condition]?;
5.9
就像修改數據一樣,刪除數據時也不能破壞數據庫的完整性約束。
DELETE?FROM?{?table?|?view?}[WHERE?condition]?;
5.10 事務
事務是一個邏輯上的單元。要么全部成功,要么全部失敗。在下面的情況下系統自動地結束一個事務:
COMMIT?[WORK]?;
ROLLBACK?[{?WORK?|?TO?savepoint_name?}]?;
SAVEPOINT?savepoint_name?;
REMOVE?SAVEPOINT?;
5.11 數據導入和導出導出
--將數據庫TEST完全導出,用戶名system?密碼manager?導出到`daochu.dmp`中
exp?system/manager@TEST?file=d:daochu.dmp?full=y
--將數據庫中的表inner_notify、notify_staff_relat導出
exp?aichannel/aichannel@TESTDB2?file=?datanewsmgnt.dmp?tables=?(inner_notify,notify_staff_relat)
導入
--將`daochu.dmp`?中的數據導入?TEST數據庫中
imp?system/manager@TEST?file=daochu.dmp
--將daochu.dmp中的表table1?導入
imp?system/manager@TEST?file=d:daochu.dmp?tables=(table1)