PL SQL 程式設計 二

2021-06-22 03:10:34 字數 3574 閱讀 9068

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...