2009年3月12日
打開Net Manager,選中服務(wù)名稱,檢查服務(wù)標(biāo)識欄里的服務(wù)名輸入是否正確。該服務(wù)名必須與服務(wù)器端監(jiān)聽器配置的全局?jǐn)?shù)據(jù)庫名一致。
方法二: 在TOAD登陸時(shí)使用全局名稱:
zhouzhenhua:1521/javafan
人品不錯(cuò),挺讓人放心的,不會像有的男的看起來很花花的,還有就是沒有明顯的缺點(diǎn),這可是很重要的
我現(xiàn)在看到的男的歪瓜裂棗的太多了
PL/SQL集合方法是用于操縱集合變量的內(nèi)置函數(shù)或過程。
語法:
collection_name.method_name[(parameter)]
注意:集合方法extend和trim不適用于PL/SQL表。
1. exists
2. count
3. limit
返回VARRAY變量所允許的最大元素個(gè)數(shù)。嵌套表和PL/SQL表的元素個(gè)數(shù)無限制,所以調(diào)用該方法時(shí)返回NULL。
4. first和last
第一個(gè)元素的下標(biāo),最后一個(gè)元素的下標(biāo)
ename_table(ename_table.first)
ename_table(ename_table.last)
5. prior和next
前一個(gè)元素的下標(biāo),后一個(gè)元素的下標(biāo)
ename_table(ename_table.prior(1))
ename_table(ename_table.next(1))
6.extend
該方法為PL/SQL集合變量增加元素,只適用于嵌套表和VARRAY。
注意:當(dāng)使用EXTEND增加元素時(shí),不能為未初始化的集合變量增加元素。
EXTEND方法有三種調(diào)用方法:
- EXTEND:添加一個(gè)null元素。
- EXTEND(n):添加n個(gè)null元素
- EXTEND(n,i):添加n個(gè)元素,元素值與第i個(gè)元素相同。
7. trim
該方法用于從集合變量尾部刪除元素,并且只適用于嵌套表和VARRAY。
TRIM共有兩種調(diào)用方法:
- TRIM: 從集合變量尾部刪除一個(gè)元素。
- TRIM(n): 從集合變量尾部刪除n個(gè)元素。
8. delete
用于刪除特定元素,只適用于嵌套表和PL/SQL表。
DELETE有三種調(diào)用方法:
- DELETE: 刪除所有的元素
- DELETE(n): 刪除第n個(gè)元素。
- DELETE(m,n):刪除m~n之間所有的元素。
第一,PL/SQL表
它只能作為PL/SQL類型,不能作為表列類型。
下標(biāo)可以為負(fù)值,并且元素個(gè)數(shù)無限制。
下標(biāo)類型key_type: 包括BINARY_INTEGER、PLS_INTEGER、VARCHAR2。
語法:
TYPE type_name IS TABLE OF element_type
[NOT NULL] INDEX BY key_type;
identifier type_name;
例如:
DECLARE
TYPE category_table_type IS TABLE OF VARCHAR2 (40)
INDEX BY VARCHAR2 (40);
category_table category_table_type;
BEGIN
category_table ('長沙') := '長沙,我愛你!';
DBMS_OUTPUT.put_line (category_table ('長沙'));
END;
第二,嵌套表
可以作為表列的數(shù)據(jù)類型使用。
當(dāng)使用嵌套表元素時(shí),需要使用構(gòu)造方法初始化嵌套表變量。
下標(biāo)從1開始計(jì)算。
語法:
TYPE type_name IS TABLE OF element_type;
identifier type_name;
例子:
DECLARE
TYPE category_table_type IS TABLE OF tb_out_service.servicename%TYPE;
category_table category_table_type;
BEGIN
category_table := category_table_type ('全省', '長沙', '常德');
SELECT servicename
INTO category_table (3)
FROM tb_out_service
WHERE serviceid = '&serviceid';
DBMS_OUTPUT.put_line (category_table (1));
DBMS_OUTPUT.put_line (category_table (2));
DBMS_OUTPUT.put_line (category_table (3));
END;
第三,變長數(shù)組(VARRAY)
需要使用構(gòu)造方法初始化VARRAY變量。
語法:
TYPE type_name is VARRAY(size_limit) OF element_type [NOT NULL];
identifier type_name;
第一,定義PL/SQL記錄
1. 自定義PL/SQL記錄
2. 使用%ROWTYPE屬性定義記錄變量
舉例:
-----------------------------------------------
DECLARE
--自定義記錄類型
TYPE emp_record_type IS RECORD (
serviceid tb_out_service%TYPE,
sericename tb_out_service%TYPE
);
emp_record emp_record_type;
--使用%ROWTYPE屬性定義記錄變量
category_record tb_out_service%ROWTYPE;
BEGIN
NULL;
END;
第二,使用PL/SQL記錄
DECLARE
--使用%ROWTYPE屬性定義記錄變量
category_r tb_out_service%ROWTYPE;
BEGIN
...
UPDATE tb_out_service
SET ROW = category_r --注意ROW關(guān)鍵字
WHERE serviceid = category_r.serviceid;
...
INSERT INTO tb_out_service
VALUES category_r; --在values子句中使用記錄成員播入數(shù)據(jù)。
...
END;
commit
rollback
savepoint a1
隱含游標(biāo):專門處理SELECT INTO、INSERT、UPDATE以及DELETE語句。
顯示游標(biāo):用于處理多行的SELECT語句。
當(dāng)在PL/SQL塊中執(zhí)行INSERT、UPDATE及DELETE語句時(shí),為了取得DML語句作用的結(jié)果,需要使用SQL游標(biāo)屬性。
第一,游標(biāo)的4種屬性
1. SQL%ISOPEN
該屬性永遠(yuǎn)都是false,沒有實(shí)際意義。
2. SQL%FOUND
語句是否操作成功。當(dāng)SQL語句有作用行時(shí)為TRUE.
3. SQL%NOTFOUND
LOOP
FETCH emp_cursor INTO v_name, v_deptno;
EXIT WHEN emp_cursor%NOTFOUND;
...
END LOOP;
4. SQL%ROWCOUNT
返回SQL語句所作用的總計(jì)行數(shù)。
該屬性用于返回已提取的實(shí)際行數(shù)。
第二,顯示游標(biāo)專用于處理SELECT語句返回的多行數(shù)據(jù)。
CURSOR cursor_name IS select_statement;
open cursor_name;
FETCH cursor_name INTO var1[, var2, ...];
CLOSE cursor_name;
例子:
DECLARE
CURSOR category_cursor
IS
SELECT *
FROM tb_out_service t
WHERE t.servicename LIKE '長沙%';
TYPE category_table_type IS TABLE OF tb_out_service%ROWTYPE
INDEX BY BINARY_INTEGER;
category_table category_table_type;
i INT;
BEGIN
OPEN category_cursor;
LOOP
i := category_cursor%ROWCOUNT + 1;
FETCH category_cursor
INTO category_table (i);
EXIT WHEN category_cursor%NOTFOUND;
DBMS_OUTPUT.put_line ( RPAD (category_table (i).serviceid, 30)
|| ' '
|| category_table (i).servicename
);
END LOOP;
CLOSE category_cursor;
END;
第三,游標(biāo)FOR循環(huán)
語法:
FOR record_name IN cursor_name LOOP
statement;
...
END LOOP;
注意:當(dāng)使用游標(biāo)FOR循環(huán)時(shí),既可以在定義部分定義游標(biāo),也可以直接在FOR循環(huán)中使用SELECT語句。
第四,參數(shù)游標(biāo)
CURSOR cursor_name(parameter_name datatype) is select_statement;
OPEN cursor_name(parameter_value)
注意:
定義參數(shù)只能指定數(shù)據(jù)類型,不能指定長度。
另外,應(yīng)該在游標(biāo)的select語句的where子句中引用游標(biāo)參數(shù),否則失去了定義參數(shù)游標(biāo)的意義。
---------------------------------------------------------------------------------------------------------------------
DECLARE
CURSOR category_cursor (NAME VARCHAR2)
IS
SELECT *
FROM tb_out_service t
WHERE t.servicename LIKE NAME || '%';
BEGIN
FOR category_record IN category_cursor ('吉首')
LOOP
DBMS_OUTPUT.put_line ( RPAD (category_record.serviceid, 30)
|| ' '
|| category_record.servicename
);
END LOOP;
END;
第五,更新或刪除游標(biāo)行
語法:
CURSOR cursor_name IS select_statement
FOR UPDATE [OF column_reference] [NOWAIT];
UPDATE table_name SET column=.. WHERE CURRENT OF cursor_name;
DELETE FROM table_name WHERE CURRENT OF cursor_name;
注意:
1. OF子句的格式:column_reference為table_name.column_name
2. WHERE CURRENT OF cursor_name, 更新或者刪除游標(biāo)所在行的數(shù)據(jù)。
3. 在使用游標(biāo)更新或刪除數(shù)據(jù)時(shí),定義游標(biāo)必須帶有FOR UPDATE子句,并且在更新或者刪除游標(biāo)時(shí)必須帶有WHERE CURRENT OF 子句。
當(dāng)查詢語句涉及到多張表時(shí),如果不帶有OF子句,會在多張表上同時(shí)加鎖,如果只在特定的表上加鎖,需要帶有OF子句。
DECLARE
CURSOR category_cursor (NAME VARCHAR2)
IS
SELECT *
FROM tb_out_service t
WHERE t.servicename LIKE NAME || '%'
FOR UPDATE OF t.querystr;
v_name CONSTANT VARCHAR2 (20) := '長沙';
BEGIN
FOR category_record IN category_cursor (v_name)
LOOP
IF INSTR (category_record.servicename, v_name || '——') <> 1
THEN
DBMS_OUTPUT.put_line ( 'delete: '
|| RPAD (category_record.serviceid, 30)
|| ' '
|| category_record.servicename
);
DELETE FROM tb_out_service
WHERE CURRENT OF category_cursor;
ELSE
DBMS_OUTPUT.put_line ( 'upate: '
|| RPAD (category_record.serviceid, 30)
|| ' '
|| category_record.servicename
);
UPDATE tb_out_service t
SET t.querystr = v_name || '——' || t.servicename
WHERE CURRENT OF category_cursor;
END IF;
END LOOP;
END;
第六, 游標(biāo)變量
游標(biāo)變量是基于REF CURSOR類型所定義的變量,它實(shí)際上是指向內(nèi)存地址的指針。顯式游標(biāo)只能定義靜態(tài)游標(biāo),而游標(biāo)變量可以在打開時(shí)指定其所對應(yīng)的SELECT語句,從而實(shí)現(xiàn)動態(tài)游標(biāo)。
TYPE ref_type_name IS REF CURSOR [RETURN return_type];
cursor_variable ref_type_name;
OPEN cursor_name FOR select_statement;
FETCH cursor_variable INTO var1[, var2, ...];
CLOSE cursor_variable;
注意:
不能在遠(yuǎn)程子程序中使用游標(biāo)變量。
當(dāng)指定子查詢時(shí),不能帶有FOR UPDATE子句。
當(dāng)指定RETURN子句時(shí),返回類型必須使用PL/SQL記錄類型。
例子:
DECLARE
TYPE category_cursor_type IS REF CURSOR
RETURN tb_out_service%ROWTYPE;
category_cursor category_cursor_type;
category_record tb_out_service%ROWTYPE;
v_name CONSTANT VARCHAR2 (40) := '長沙';
BEGIN
OPEN category_cursor FOR
SELECT *
FROM tb_out_service t
WHERE t.servicename LIKE v_name || '%';
LOOP
FETCH category_cursor
INTO category_record;
EXIT WHEN category_cursor%NOTFOUND;
DBMS_OUTPUT.put_line ( RPAD (category_record.serviceid, 30)
|| ' '
|| category_record.servicename
);
END LOOP;
END;
編寫PL/SQL時(shí),可以直接使用大多數(shù)的單行SQL函數(shù),這些單行函數(shù)包括數(shù)字函數(shù)、字符函數(shù)、轉(zhuǎn)換函數(shù)及日期函數(shù)。
注意:某些SQL函數(shù)只能在SQL語句中引用,而不能直接在PL/SQL語句中引用,這些SQL函數(shù)包括GREATEST、LEAST、DECODE及所有的分組函數(shù)(如SUM)。
約束用于確保數(shù)據(jù)庫數(shù)滿足業(yè)務(wù)規(guī)則。
約束包括:NOT NULL,UNIQUE,PRIMARY KEY,F(xiàn)OREIGN KEY以及CHECK等5種類型。
建立主鍵約束和唯一約束時(shí),Oralce會基于約束列自動建立唯一索引;主鍵約束不允許為NULL,唯一約束允許為NULL。
一張表只能建立一個(gè)主鍵約束。
建表約束:NOT NULL只能在列級定義;其它4種既可以在列級定義,也可以在表級定義。復(fù)合主鍵約束只能在表級定義。
維護(hù)約束:增加NOT NULL約束時(shí)必須使用MODIFY子句,而增加其它約束時(shí)需要使用ADD子句。
第一, 定義約束
---------------------------------------------
語法:
CREATE TABLE [SCHEMA.]table_name(
column_name datatype [DEFAULT expr] [column_constraint],
...
[table_constraint][, ...]
);
例子:
CREATE TABLE tt_user_info
(
ID VARCHAR2(20 BYTE),
NAME VARCHAR2(20 BYTE) NOT NULL,
category_id VARCHAR2(20 BYTE) REFERENCES tb_out_service(serviceid),
remark VARCHAR2(1000)
);
ALTER TABLE tt_user_info ADD (
CHECK ( LENGTH(NAME)>2),
PRIMARY KEY (ID),
UNIQUE (NAME)
);
說明:
1. NOT NULL,非空約束
not null
2. UNIQUE,唯一約束
UNIQUE (COL_NAME)
3. PRIMARY KEY,主鍵約束
primary key (col_name1 [, col_name2])
4. FOREIGN KEY,外鍵約束
它有三種類型:
references primary_table(primary_col)
on delete cascade
on delete set null
5. CHECK,檢查約束
check (money > 1000)
第二, 維護(hù)約束
----------------------------------------
1. 增加約束
NOT NULL使用ALTER MODIFY子句,其它的使用ALTER ADD子句
-------------------------------
CREATE TABLE tt_user(NAME VARCHAR2(20));
ALTER TABLE tt_user MODIFY user_name NOT NULL;
ALTER TABLE tt_user ADD CONSTRAINT constraint_name UNIQUE(NAME);
ALTER TABLE tt_user ADD CONSTRAINT constraint_name PRIMARY KEY(NAME);
ALTER TABLE tt_user ADD parentid VARCHAR2(20)
CONSTRAINT constraint_name
REFERENCES tb_out_service(serviceid);
2. 修改約束名
ALTER TABLE table_name RENAME CONSTRAINT old_constraint_name TO new_constraint_name
3. 刪除約束
ALTER TABLE table_name DROP CONSTRAINT constraint_name
4. 禁止約束
ALTER TABLE table_name DISABLE CONSTRAINT constraint_name [CASCADE];
5.激動約束
ALTER TABLE table_name ENABLE CONSTRAINT constraint_name;
第三. 顯示約束信息
所有約束信息
SELECT *
FROM user_constraints
用戶約束所對應(yīng)的表列
SELECT *
FROM user_cons_columns;
臨時(shí)表分為兩種,它們只在事務(wù)或者會話內(nèi)有效。
------------------------------------
A. 事務(wù)臨時(shí)表(缺省):
CREATE GLOBAL TEMPORARY TABLE table_name(col_name INT);
CREATE GLOBAL TEMPORARY TABLE table_name(col_name INT) ON COMMIT DELETE ROWS;
------------------------------------
B. 會話臨時(shí)表:
CREATE GLOBAL TEMPORARY TABLE table_name(col_name INT) ON COMMIT PRESERVE ROWS;
A. 刪除數(shù)據(jù)
-----------------------------------------
方法一:
delete(DML)
只是刪除數(shù)據(jù),并沒有釋放空間
操作可以回退
例如:
DELETE FROM table_name;
方法二:
truncate table(DDL)
刪除數(shù)據(jù),釋放表空間,操作不能回退
例如:
TRUNCATE TABLE table_name;
B. 刪除庫表
------------------------------------------
DROP TABLE table_name [CASCADE CONSTRAINTS] [purge]
CASCADE CONSTRAINTS: 表示是否級聯(lián)刪除外鍵約束
C. 恢復(fù)刪除的庫表(10g)
FLASHBACK TABLE table_name TO BEFORE DROP;