1 for迴圈
語法:begin
for i in reverse 1..10 loop
insert into users values(i,』歐巴馬『);
end loop;
end;
注意:迴圈變數 i 是隱含增加的,所以無法看到
2 goto語句
goto 語句用於跳轉到特定的位置去執行語句。由於goto語句會減少程式的可讀性,所以一般情況下
不建議使用goto語句
3 null語句
null語句不會執行任何操作,但是可以增加程式的可讀性
4 建立返回值是乙個結果集的儲存過程
(1) 建立乙個包:
sql> create or replace package testpackage as
type test test_cursor is ref cursor;
end testpackage;
(2) 建立儲存過程
sql> create or replace procedure sp_procedure1
(stuno in number, param_cursor out testpackage.test_cursor) is
begin
open param_cursor for select * from emp where sutno=stuno;
end;
5 分頁
(1) sql語句
select * from
(select *,rownum no from
(select * from emp) where rownum <=20) where rownum >=10;
(2) 建立乙個包
create or replace package testpackage2 as
type test test_cursor is ref cursor;
end testpackage2;
(3) 建立儲存過程
sql> create or replace procedure procedurename2
(tablename in varchar2, -- 表名
pagesize in number, -- 每頁顯示的記錄數
pagenow in number, -- 當前是第幾頁
pagecount out number, -- 總頁數
p_cursor out testpackage2.test_cursor) is
v_sql varchar2(1000);
v_beginnum number := (pagenow -1)* pagesize + 1;
v_endnum number := pagenow * pagesize;
begin
v_sql := 'select * from (select *,rownum no from (select * from '|| tablename ||')
where rownum <= '|| v_endnum ||') where rownum >= '|| v_beginnum;
open p_cursor for v_sql;
-- 建立乙個sql語句
v_sql := 'select count(*) from ' || tablename;
-- 執行sql語句,將結果儲存
execute immediate v_sql into rows;
if mod(rows,pagesize) = 0
then pagecount := rows / pagesize;
else
pagecount := rows / pagesize + 1;
end if;
-- 關閉游標
close p_cursor;
end;
6 異常處理
(1) 預定義異常
(2) 非預定義異常
(3) 自定義異常
例1sql> declare v_name emp.ename%type;
begin
select ename into v_name from emp where empno = &no;
dbms_output.put_line('名字:' || v_name);
exception
when no_data_found
then dbms_output.put_line('編號沒有!');
end;
預定義異常
a case_not_found
在編寫case 語句時,如果在when子句中沒有包含必須的條件分支(沒有符合條件的),就會觸發case_not_found異常
b cursor_already_open
當重新開啟已經開啟的游標時觸發此異常
c dup_val_on_index
在唯一索引所對應的列上插入重複值時觸發此異常
d invalid_cursor
當試圖在不合法的游標上進行操作時觸發此異常
e invalid_number
當輸入的數字無效時觸發此異常
f too_many_rows
當返回值不止是一條記錄時觸發此異常
g zero_divide
當進行 x/0,即除數為零的操作時觸發此異常
h value_error
當進行賦值操作時,如果變數的長度不足以儲存實際資料時觸發此異常
i login——denide
當使用者非法登入時會觸發此異常
j not_logged_on
如果使用者沒有登入就執行dml操作,就會觸發此異常
k storage_error
如果超出了記憶體空間,就會觸發此異常
l timeout_on_resource
當oracle等待資源時,如果發生超時情況,就會觸發此異常
自定義異常
sql> create or replace procedure procedurename2(sp_empno number) is
myexpception exceptiom; -- 自定義乙個異常
begin
update emp set sal = sal * 1.2 where empno = &no;
if sql%notfound then
raise myexpception; -- 觸發自定義異常
end if;
exception
when no_data_found
then dbms_output.put_line('沒有更新資料!');
end;
pl sql程式設計(二)
建立乙個函式 輸入姓名 返回年薪 表裡存的是月薪 create function sp fun2 spname varchar2 return number is yearsal number 10,2 begin select sal 12 into yearsal from emp where ...
PL SQL 程式設計 二
1 for迴圈 語法 begin for i in reverse 1.10 loop insert into users values i,歐巴馬 end loop end 注意 迴圈變數 i 是隱含新增的。所以無法看到 2 goto語句 goto 語句用於跳轉到特定的位置去執行語句。因為goto...
plsql程式設計詳解 二
九 迴圈語句 一共有三種迴圈方式 oracle中沒有自增 自身 自身 1即可 while 條件 loop end loop loop exit when 條件 end loop for i in 1.5 必須為連續區間 loop end loop 例1 while迴圈列印數字的1 10set ser...