存儲(chǔ)過(guò)程
注 :
(1)在procedure中想用ddl,就必須用execute immediat 'create table text1(id int not null primary key)';
且必須顯授權(quán)(grant create any table to 用戶名),否則報(bào)'insufficient privileges',無(wú)權(quán)限.
(2)每條語(yǔ)句都需以';'結(jié)尾.
1.基本語(yǔ)法 : 創(chuàng)建一個(gè)存儲(chǔ)過(guò)程,如果存在就覆蓋. (注:as/is沒(méi)區(qū)別,只是兼容別的SQL而已)
create or replace procedure 過(guò)程名(參數(shù)1 in number ,參數(shù)2 in number) is
變量1 integer:=0;
變量2 date;
exp exception; --定義異常
begin
--存儲(chǔ)過(guò)程中調(diào)用DDL,必須用動(dòng)態(tài)SQL方法
execute immediate ' create table testtable (testid int not null primary key,testname varchar2(10) ) ';
execute immediate 'insert into testtable values(1,110) ';
raise exp; --拋出異常
exception --異常處理
when exp then
dbms_output.put_line( '執(zhí)行成功1 '); --控制臺(tái)打印
when others then
dbms_output.put_line( '執(zhí)行失敗0 ');
end;
2.基本語(yǔ)句:
(1)變量賦值
<1>變量初始化賦值:=值;
<2>變量賦值: select ....into... from ....; --select ... from ... 方法在存儲(chǔ)過(guò)程中時(shí)的格式
select name1,name2 into var1,var2 from table1
(2)For 循環(huán)
For ... in ... LOOP
--執(zhí)行語(yǔ)句
end LOOP;
<1>循環(huán)遍歷游標(biāo)
create or replace procedure test() as
Cursor cursor is select name from student; name varchar(20);
begin
for name in cursor LOOP
begin
dbms_output.putline(name);
end;
end LOOP;
end test;
<2>循環(huán)遍歷數(shù)組
create or replace procedure test(varArray in myPackage.TestArray) as
--(輸入?yún)?shù)varArray 是自定義的數(shù)組類型,定義方式見(jiàn)標(biāo)題6)
i number;
begin
i := 1; --存儲(chǔ)過(guò)程數(shù)組是起始位置是從1開(kāi)始的,與java、C、C++等語(yǔ)言不同。因?yàn)樵贠racle中本是沒(méi)有數(shù)組
的概念的,數(shù)組其實(shí)就是一張
--表(Table),每個(gè)數(shù)組元素就是表中的一個(gè)記錄,所以遍歷數(shù)組時(shí)就相當(dāng)于從表中的第一條記錄開(kāi)始遍歷
for i in 1..varArray.count LOOP
dbms_output.putline('The No.'|| i || 'record in varArray is:'||varArray(i));
end LOOP;
end test;
3.代碼拋出異常用raise (異常名);
4.游標(biāo) :
(1)系統(tǒng)級(jí)游標(biāo):cursor SYS_REFCURSOR;只能通過(guò)open方法打開(kāi)和賦值
OPEN cursor FOR select name1,name2 from table1 where a='1'; --sql語(yǔ)法
LOOP
FETCH cursor INTO name1,name2; --只能通過(guò)fetch into 打開(kāi)和遍歷
exit when cursor%NOTFOUND; --可用三個(gè)狀態(tài):%NOTFOUND(未找到記錄);%FOUND(找到記
錄);%ROWCOUNT(當(dāng)前游標(biāo)指向的行位置)
dbms_output.putline(name1||name2);
END LOOP;
5.連接運(yùn)算符 : || ,即'ABC'||'123' : ABC123
6.單行注釋: --;多行:/**/;