存儲過程
注 :
(1)在procedure中想用ddl,就必須用execute immediat 'create table text1(id int not null primary key)';
且必須顯授權(grant create any table to 用戶名),否則報'insufficient privileges',無權限.
(2)每條語句都需以';'結尾.
1.基本語法 : 創建一個存儲過程,如果存在就覆蓋. (注:as/is沒區別,只是兼容別的SQL而已)
create or replace procedure 過程名(參數1 in number ,參數2 in number) is
變量1 integer:=0;
變量2 date;
exp exception; --定義異常
begin
--存儲過程中調用DDL,必須用動態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( '執行成功1 '); --控制臺打印
when others then
dbms_output.put_line( '執行失敗0 ');
end;
2.基本語句:
(1)變量賦值
<1>變量初始化賦值:=值;
<2>變量賦值: select ....into... from ....; --select ... from ... 方法在存儲過程中時的格式
select name1,name2 into var1,var2 from table1
(2)For 循環
For ... in ... LOOP
--執行語句
end LOOP;
<1>循環遍歷游標
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>循環遍歷數組
create or replace procedure test(varArray in myPackage.TestArray) as
--(輸入參數varArray 是自定義的數組類型,定義方式見標題6)
i number;
begin
i := 1; --存儲過程數組是起始位置是從1開始的,與java、C、C++等語言不同。因為在Oracle中本是沒有數組
的概念的,數組其實就是一張
--表(Table),每個數組元素就是表中的一個記錄,所以遍歷數組時就相當于從表中的第一條記錄開始遍歷
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.游標 :
(1)系統級游標:cursor SYS_REFCURSOR;只能通過open方法打開和賦值
OPEN cursor FOR select name1,name2 from table1 where a='1'; --sql語法
LOOP
FETCH cursor INTO name1,name2; --只能通過fetch into 打開和遍歷
exit when cursor%NOTFOUND; --可用三個狀態:%NOTFOUND(未找到記錄);%FOUND(找到記
錄);%ROWCOUNT(當前游標指向的行位置)
dbms_output.putline(name1||name2);
END LOOP;
5.連接運算符 : || ,即'ABC'||'123' : ABC123
6.單行注釋: --;多行:/**/;