------------------------2013-5-17------------------------
set serveroutput on;
-- Oracle PL/SQL 塊
-- 聲明部分
declare
lv_Age_num number := 12;
lv_Name_char varchar2(8) default 'AZhu';???? --設置默認值--
lv_Sex_char constant varchar2(3) := '男';
-- 執行部分
begin
? dbms_output.put_line(lv_Age_num);
? dbms_output.put_line(lv_Name_char);
? dbms_output.put_line(lv_Sex_char);
? dbms_output.put_line('==========');
? lv_Age_num := 18;
? lv_Name_char := 'ANiu';
? dbms_output.put_line(lv_Age_num);
? dbms_output.put_line(lv_Name_char);
end;
-- Oracle PL/SQL 塊(if then 條件判斷)
-- Oracle PL/SQL 塊(case 分支判斷)
? case lv_Age_num
? when 10 then
??? dbms_output.put_line(lv_Name_char || '等于10');
? when 18 then
??? dbms_output.put_line(lv_Name_char || '大于10');
? else
??? dbms_output.put_line(lv_Name_char || '小于10');
? end case;
? case
? when lv_Age_num = 10 then
??? dbms_output.put_line(lv_Name_char || '等于10');
? when lv_Age_num > 10 then
??? dbms_output.put_line(lv_Name_char || '大于10');
? else
??? dbms_output.put_line(lv_Name_char || '小于10');
? end case;
--創建測試表
create table c6(
a int primary key,
b varchar2(10) unique
)
desc c6;
insert into c6 values(1,'Niu1');
select * from c6;
commit;
--批量添加
-- While
declare
lv_A_num number := 2;
begin
? while lv_A_num < 5
? loop
??? insert into c6
??? values
??? (lv_A_num, 'Niu' || to_char(lv_A_num));
??? lv_A_num := lv_A_num + 1;
? end loop;
? -- 提交
? commit;
end;
-- For
begin
? for i in reverse 11..12???? --如果加了reverse,那么表示數字從12,11倒序過來了。--
? loop
??? insert into c6
??? values
??? (i, 'Niu' || to_char(i));
? end loop;
? -- 提交
? commit;
end;
--loop? exit when方式--
declare
i number := 13;
begin
? loop
??? exit when i = 14;
??? insert into c6
??? values
??? (i, 'Niu' || to_char(i));
??? i := i +1;????????????????? --遞增算法--
? end loop;
? -- 提交
? commit;
end;
--截斷表
truncate table c6;
##過程##
declare
lv_a int;????????????? --直接寫類型,也可以引用表或視圖類型--
lv_b varchar2(10);
begin
? select a,b into lv_a,lv_b from c6 where a = 9;
? dbms_output.put_line('lv_a:' || lv_a);
? dbms_output.put_line('lv_b:' || lv_b);
end;
--record方式--
declare
type lvv is record(
lv_a int,
lv_b varchar2(10)
);
lv lvv;
begin
? select a,b into lv from c6 where a = 8;???? --數據封裝的值其實也是一一對應的--
? dbms_output.put_line('lv_a:' || lv.lv_a);
? dbms_output.put_line('lv_b:' || lv.lv_b);
end;
--record方式+cursor游標方式--
declare
type lvv is record(
lv_a int,
lv_b varchar2(10)
);
lv lvv;
cursor cur? is select a,b from c6 where a = 7;
begin
? open cur;
? fetch cur into lv;
? dbms_output.put_line('lv_a:' || lv.lv_a);
? dbms_output.put_line('lv_b:' || lv.lv_b);
? close cur;
end;
##存儲過程##
--record方式+cursor游標方式--
create or replace procedure mypro
as
--declare
type lvv is record(
lv_a int,
lv_b varchar2(10)
);
lv lvv;
cursor cur? is select a,b from c6 where a = 7;
begin
? open cur;
? fetch cur into lv;
? dbms_output.put_line('lv_a:' || lv.lv_a);
? dbms_output.put_line('lv_b:' || lv.lv_b);
? close cur;
end;
#調用#
begin
mypro;
end;
--cursor + record + while--
declare
type lvv is record(
lv_a int,
lv_b varchar2(10)
);
lv lvv;
cursor cur? is select a,b from c6 where a > 7;? --游標帶參數方式,cursor cur (p_a int)? is select a,b from c6 where a > p_a;
begin
? open cur;???????????????????????????????????????????? --游標帶參數方式,open cur(5);
? fetch cur into lv;
? while cur%found
? loop
? dbms_output.put_line('lv_a:' || lv.lv_a);
? dbms_output.put_line('lv_b:' || lv.lv_b);
? fetch cur into lv;?? --提取下一個
? end loop;
? close cur;
end;
--cursor + record + while--
declare
cursor cur? is select a,b from c6;
begin
? -- 以下操作全部自動
? -- 打開游標
? -- 提取游標
? -- 關閉游標
? for lv in cur
? loop
? dbms_output.put_line('lv_a:' || lv.a);
? dbms_output.put_line('lv_b:' || lv.b);
? end loop;
end;
begin
? -- 以下操作全部自動
? -- 打開游標
? -- 提取游標
? -- 關閉游標
? for lv in (select a,b from c6)???????????? --直接寫SQL語句--
? loop
? dbms_output.put_line('lv_a:' || lv.a);
? dbms_output.put_line('lv_b:' || lv.b);
? end loop;
end;
###62.sql###
declare
-- 變量名? 類型? 默認值
name varchar2(8) default 'Aniu';
sex nvarchar2(2) := '男';
-- 常量,定義關鍵字:constant
Pi constant number(9,8) := 3.14159265;
-- 執行
begin
? dbms_output.put_line(Pi);
? -- print
? dbms_output.put_line(name);
? dbms_output.put_line(sex);
?
? --Pi := 4;? --會報錯,常量不能修改值。
? name := 'AZhu';
? --dbms_output.put_line(Pi);
? dbms_output.put_line(name);
-- 異常處理
-- exception
end;
-- 條件判斷 IF
-- 分支判斷 CASE(選擇器,準確值),(表達式,范圍),(比較賦予值)
-- 循環控制 while 條件? loop?? ...? end loop;??????????? -- while與loop之間都是沒有符號的!!
??????????? for i in 5 .. 10? loop ... end loop;?? for i in reverse 11 .. 15?? -- i計數器for遞增,不需要手動修改,否則會報錯。
??????????? loop? exit when 條件;? end loop;
##case第三個情況##
declare
type lvv is record(
lv_a int,
lv_b varchar2(10)
);
lv lvv;
cursor cur? is select a,b from c6;
lv_txt varchar2(18);
begin
? open cur;
? loop
??? fetch cur into lv;
??? exit when cur%notfound;
??? lv_txt := case lv.lv_a???????? --設置的字段,將值給lv_txt變量--
??? when '1' then '排第一個'
??? when '2' then '排第二個'
??? when '3' then '排第三個'
??? when '4' then '排第四個'
??? else? '其他'
??? end;
??? dbms_output.put_line('lv_txt:' || lv_txt);
? end loop;
? close cur;
end;
begin
? for i in 1..3
? loop
??? dbms_output.put_line(i);
??? --i := i + 1;??????????????? -- PLS-00363: 表達式 'I' 不能用作賦值目標
? end loop;
end;
-- 語句跳轉
?begin
? dbms_output.put_line('1');
? dbms_output.put_line('2');
? goto test_row;
? dbms_output.put_line('3');
? dbms_output.put_line('4');
? <<test_row>>
? dbms_output.put_line('5');
?end;
-- 非法"跳轉"
-- 注意:不可跳轉至if/while/for/loop等子句
begin
? dbms_output.put_line('1');
? goto test_row;
? dbms_output.put_line('3');
? if 1 = 1 then
??? dbms_output.put_line('4');
??? <<test_row>>
? end if;
? dbms_output.put_line('5');
end;
-- 注意:不可從異常處理塊中跳轉回到PL/SQL塊的執行部分
declare
? i int;
begin
? i := i / 0;
? <<test_row>>
exception
? when zero_divide then
??? go_to test_row;
end;
--創建表--
create table c7
(
a int primary key
);
insert into c7 values (1);
select * from c7;
begin
? insert into c7 values (1);
exception
? when dup_val_on_index then
??? dbms_output.put_line('錯誤: 添加重復值!');
end;
-- 捕獲自定義異常
-- (1)聲明 exception
-- (2)綁定 pragma exception_init(exception, code)
-- (3)捕獲
declare
-- 聲明異常
Invalid_Number exception;
-- 綁定
pragma exception_init(Invalid_Number, -01722);
begin
? insert into c7 values ('ABC');
exception
? -- 捕獲異常
? when Invalid_Number then
??? dbms_output.put_line('錯誤: 非法數字值!');
end;
begin
? insert into c7 values ('ABC');
exception
? -- 捕獲異常
? when others then??????????????????????? -- 其他異常
??? dbms_output.put_line(sqlcode);??????? -- 異常編號
??? --dbms_output.put_line(sqlerrmsg);??? -- 報錯:PLS-00201: 必須說明標識符 'SQLERRMSG'
??? dbms_output.put_line(sqlerrm);??????? -- sqlerrm就對了。
??? dbms_output.put_line('錯誤: 未知!');
end;
while cur_titles%found loop??? end loop;
或
loop? exit when cur_titles%notfound??? end loop;
select trunc(sysdate) from dual;
----------
17-5月 -13
declare
ex_title_test exception;
pragma exception_init( ex_title_test, -01476);
lv_test_num number(4);
lv_errmsg_txt varchar2(80) := 'No any error!';
lv_errnum_txt varchar2(10) := '911';
begin
? lv_test_num := 12 / 0;
? dbms_output.put_line ( lv_errmsg_txt );
? dbms_output.put_line ( lv_errnum_txt );
? exception
? when ex_title_test then dbms_output.put_line ( '除數不可以為零!' );
? lv_errmsg_txt := substr(sqlerrm, 1 , 80);
? lv_errnum_txt := sqlcode;
? dbms_output.put_line ( lv_errmsg_txt );
? dbms_output.put_line ( lv_errnum_txt );
end;
select 60 / 0 from dual;
ORA-01476: 除數為 0
select sqlcode from dual;? -- 執行出錯
select sqlerrm from dual;? -- 執行出錯
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
