1. 程式人生 > >書寫儲存過程遇到的問題(後續新增中。。。。)

書寫儲存過程遇到的問題(後續新增中。。。。)

1。。。基本上是格式還有細節有小問題

拿上面的圖說一下吧,這很明顯是一個有參儲存,

1.剛開始引數外面沒寫括號(低階錯誤)

2.還有標點符號要注意大小寫的問題

3.其他的暫時還沒碰上,碰上再補充.

接著上圖進行儲存的呼叫吧(附圖):

呼叫結果(附圖):

2.這裡再說一下一個好玩的符號(=>): 這個像小箭頭是指定引數名稱呼叫。


此部分使用 “引數預設值”那一小節的儲存過程。
用於說明當最後2個引數是有預設的時候,如何跳過中間那個

實際運用:比如資料庫有四個欄位吧,有一個欄位呢預設好了預設值,我實際操作的話可以通過=>來跳過這個欄位,就是這個意思

3.再說一下我們需要輸入值的時候碰到的問題。

點執行後跳出輸出框,到這一步都沒問題2333,隨意輸入10,出現錯誤提示

這裡說一下:怎麼回事呢,正確的寫法是v_age int := &no,意思是將使用者輸入的數字賦值給左邊的v_age變數,我寫成了

v_age := &no,沒有給變數規定值型別,故報錯!

4.今天下午看到前輩寫的一段儲存過程,硬是沒看懂(附圖)

就是紅框中的insert into ...select...from(將源表插入目標表),乍一看,一臉懵比,上網一查,

準確的說是資料拷貝(說高大上點:資料遷移)

大概操作:先根據主表(想進行資料遷移的表t1),創建出現在的表t2(欄位保持一致):

insert into t2() select * from t1

commit;

如果想將t2的表在複製出去成t3:

create table t3 as select * from t2;

還有一個select into.....from(將源表插入目標表):

例子:

select * into target_table from source_table;

insert into target_table(column1,column2) select column1,5 from source_table;

以上兩句都是將源表source_table的記錄插入到目標表target_table,但兩句又有區別。

第一句(select into from)要求目標表target_table不存在,因為在插入時會自動建立。

第二句(insert into select from)要求目標表target_table存在,由於目標表已經存在,

所以我們除了插入源表source_table的欄位外,還可以插入常量,如例中的:5。 

流程控制語句

5.Oracle的條件語句case when then...end case

6.Oralce資料庫的內建儲存過程[指使用者自定義的異常錯誤資訊](-20000--20999)

RAISE_APPLCATION_ERROR();

7.Oralce資料庫的事務處理語句

1.commit

2.rollback

3.save point:儲存點(savepoint)是事務處理過程中的一個標誌,和回滾命令(rollback)結合使用,主要的用途是允許使用者將某一段處理回滾而不必回滾整個事務,這在pl/sql研發中還是非常有用處的。

如圖:

示範用例:

下面的例子中,把savepoint標記在insert語句之前,如果這條insert語句試圖將重複的資料儲存到emp表中的話,將觸發執行預先定義的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,當你指定回滾到某個savepoint時,那麼回滾操作將回滾這個savepoint後面的所有操作(即使後面可能標記了n個savepoint)。例如,在一段處理中
你定義了五個savepoint,從第三個savepoint回滾,後面的第四、第五個標記的操作都將被回滾,如果不使用rollback to savepoint_name而使用rollback,將會滾整個事務處理。

如果你在遞迴子程式裡面定義了一個savepoint, 如果每一個遞迴層都設定了savepoint. 此時, 你只能回滾到最近的一個savepoint. 

savepoint的宣告能在同一個事務處理裡面重複定義. 他的作用就是把savepoint從上一個位置轉移到目前的位置. 因而,執行回滾也只回滾到最近的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個數做限制.

8.ORACLE NO_DATA_FOUND的三種處理方法,如果需要將表中的值賦給變數,一般採取這種形式:

sql程式碼如下:

select col

into v_col

FROM t_table

WHERE condition

如果找不到資料,就會有資料找不到的異常,此時有三種方法解決:

1.普通的異常捕獲的方式

2.通過表關聯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中特有的迴圈語句和操作符

四處箭頭:

1.<<next>>:loop迴圈的標籤,可以對標籤本身進行操作,例如:goto next:就是使其跳出loop迴圈

2.end loop:結束loop迴圈

3.=>:plsql中傳參的一種方法

4.Descerr:與平臺進行操作互動的資訊.

下附上友情連結