书写存储过程遇到的问题(后续添加中。。。。)
1。。。基本上是格式還有細節(jié)有小問題
?
拿上面的圖說一下吧,這很明顯是一個有參存儲,
1.剛開始參數(shù)外面沒寫括號(低級錯誤)
2.還有標(biāo)點符號要注意大小寫的問題
3.其他的暫時還沒碰上,碰上再補充.
?
接著上圖進行存儲的調(diào)用吧(附圖):
調(diào)用結(jié)果(附圖):
2.這里再說一下一個好玩的符號(=>): 這個像小箭頭是指定參數(shù)名稱調(diào)用。
此部分使用 “參數(shù)默認值”那一小節(jié)的存儲過程。
用于說明當(dāng)最后2個參數(shù)是有默認的時候,如何跳過中間那個
實際運用:比如數(shù)據(jù)庫有四個字段吧,有一個字段呢預(yù)設(shè)好了默認值,我實際操作的話可以通過=>來跳過這個字段,就是這個意思
?
?
3.再說一下我們需要輸入值的時候碰到的問題。
點運行后跳出輸出框,到這一步都沒問題2333,隨意輸入10,出現(xiàn)錯誤提示
?
這里說一下:怎么回事呢,正確的寫法是v_age?int := &no,意思是將用戶輸入的數(shù)字賦值給左邊的v_age變量,我寫成了
v_age := &no,沒有給變量規(guī)定值類型,故報錯!
4.今天下午看到前輩寫的一段存儲過程,硬是沒看懂(附圖)
就是紅框中的insert into ...select...from(將源表插入目標(biāo)表),乍一看,一臉懵比,上網(wǎng)一查,
準(zhǔn)確的說是數(shù)據(jù)拷貝(說高大上點:數(shù)據(jù)遷移)
大概操作:先根據(jù)主表(想進行數(shù)據(jù)遷移的表t1),創(chuàng)建出現(xiàn)在的表t2(字段保持一致):
insert into?t2() select * from t1
commit;
如果想將t2的表在復(fù)制出去成t3:
create table t3 as select * from t2;
還有一個select into.....from(將源表插入目標(biāo)表):
例子:
select * into target_table from source_table;
insert into target_table(column1,column2) select column1,5 from source_table;
以上兩句都是將源表source_table的記錄插入到目標(biāo)表target_table,但兩句又有區(qū)別。
第一句(select into from)要求目標(biāo)表target_table不存在,因為在插入時會自動創(chuàng)建。
第二句(insert into select from)要求目標(biāo)表target_table存在,由于目標(biāo)表已經(jīng)存在,
所以我們除了插入源表source_table的字段外,還可以插入常量,如例中的:5。?
?
流程控制語句
5.Oracle的條件語句case when then...end case
6.Oralce數(shù)據(jù)庫的內(nèi)置存儲過程[指用戶自定義的異常錯誤信息](-20000--20999)
RAISE_APPLCATION_ERROR();
7.Oralce數(shù)據(jù)庫的事務(wù)處理語句
1.commit
2.rollback
3.save point:保存點(savepoint)是事務(wù)處理過程中的一個標(biāo)志,和回滾命令(rollback)結(jié)合使用,主要的用途是允許用戶將某一段處理回滾而不必回滾整個事務(wù),這在pl/sql研發(fā)中還是非常有用處的。
如圖:
示范用例:
下面的例子中,把savepoint標(biāo)記在insert語句之前,如果這條insert語句試圖將重復(fù)的數(shù)據(jù)保存到emp表中的話,將觸發(fā)執(zhí)行預(yù)先定義的dup_val_on_index例外處理,在這里面的rollback to do_insert命令將回滾上面的那條insert操作,而不會影響前面的所有操作。
declare
?? emp_id? emp.empno%type;
begin
?? update emp set ... where empno = emp_id;
?? delete from emp where ...
?? ...
?? savepoint do_insert;
?? insert into emp values (emp_id, ...);
exception
?? when dup_val_on_index then
????? rollback to do_insert;
end;
如果你定義了多個savepoint,當(dāng)你指定回滾到某個savepoint時,那么回滾操作將回滾這個savepoint后面的所有操作(即使后面可能標(biāo)記了n個savepoint)。例如,在一段處理中
你定義了五個savepoint,從第三個savepoint回滾,后面的第四、第五個標(biāo)記的操作都將被回滾,如果不使用rollback to savepoint_name而使用rollback,將會滾整個事務(wù)處理。
如果你在遞歸子程式里面定義了一個savepoint, 如果每一個遞歸層都設(shè)置了savepoint. 此時, 你只能回滾到最近的一個savepoint.?
savepoint的聲明能在同一個事務(wù)處理里面重復(fù)定義. 他的作用就是把savepoint從上一個位置轉(zhuǎn)移到目前的位置. 因而,執(zhí)行回滾也只回滾到最近的savepoint.
下面是個例子:?
begin
?? ...
?? savepoint my_point;
?? update emp set ... where empno = emp_id;
?? ...
?? savepoint my_point;? -- move my_point to current point
?? insert into emp values (emp_id, ...);
exception
?? when others then
????? rollback to my_point;
end;
另外,oracle沒有對每個session里面能使用的savepoint個數(shù)做限制.
?
8.ORACLE NO_DATA_FOUND的三種處理方法,如果需要將表中的值賦給變量,一般采取這種形式:
sql代碼如下:
select col
into v_col
FROM t_table
WHERE condition
如果找不到數(shù)據(jù),就會有數(shù)據(jù)找不到的異常,此時有三種方法解決:
1.普通的異常捕獲的方式
2.通過表關(guān)聯(lián)left join的方式
3.通過max的方式
方法一:sql代碼:
BEGIN?
? ? ? ? ? ?SELECT col
? ? ? ? ? ?INTO v_col
? ? ? ? ? ?FROM t_table
? ? ? ? ? ?WHERE condition?
EXCEPTION WHEN NO_DATA_FOUND THEN
? ? ? ? ? ?do omething
END;
方法二:語法:
sql代碼:
select nvl(b.col,自定義的默認值) into v_col
form(select 1 rn from dual)a
left join(
? ? ? ? ? ? SELECT col,rownum rn
? ? ? ? ? ? FROM t_table
? ? ? ? ? ? WHERE condition
)b on a.rn? = b.rn
方法三?語法:
sql代碼:
SELECT max(col)INTO v-col
FROM t_table
WHERE condition
?
9.plsql中特有的循環(huán)語句和操作符
四處箭頭:
1.<<next>>:loop循環(huán)的標(biāo)簽,可以對標(biāo)簽本身進行操作,例如:goto next:就是使其跳出loop循環(huán)
2.end loop:結(jié)束loop循環(huán)
3.=>:plsql中傳參的一種方法
4.Descerr:與平臺進行操作互動的信息.
?
?
下附上友情鏈接
??網(wǎng)上供應(yīng)鏈業(yè)務(wù)
?
?
?
?
?
《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的书写存储过程遇到的问题(后续添加中。。。。)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle的游标
- 下一篇: Oracle的关系运算