書寫儲存過程遇到的問題(後續新增中。。。。)
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:與平臺進行操作互動的資訊.
下附上友情連結