【正文】
在嵌套塊中變量的作用域 . –使用標簽限定嵌套塊中的變量 –描述異常的作用域 –識別嵌套塊中異常的作用域問題 –描述異常在嵌套塊中的傳播方式及其影響 61 home back first prev next last 識別變量作用域 ? 前面已學習過嵌套塊 , 變量的作用域和異常的傳播 . – 理解了如何正確處理異常 , 本部分先復習前面知識 , 然后再講述新的內容 . ? 命名異常是一種 PL/SQL 變量 . – 要正確處理異常 , 需要理解異常變量的作用域和可見性 . – 這在使用嵌套塊時尤其重要 . 62 home back first prev next last 復習嵌套塊 ? 下例有外層 (父 ) 塊 (藍色顯示 ) 和 嵌套 (子 )塊 (紅色顯示 ). – 變量 v_outer_variable 在父塊中定義,變量v_inner_variable 在子塊中定義 . 63 home back first prev next last 復習變量作用域 ? 變量作用域是變量在其中可被訪問和使用的一個塊或多個塊 . – PL/SQL中 ,變量作用域是其定義所在塊及其所有子塊 . – 下例兩個變量的作用域是什么 ? 64 home back first prev next last 復習變量作用域 ? 閱讀下面代碼 . 每個變量的作用域是什么 ? 65 home back first prev next last 復習變量作用域 ? 下面代碼為什么出錯 ? 66 home back first prev next last 復習變量作用域 ? 下面代碼正確嗎 ? 為什么 ? 67 home back first prev next last PL/SQL 怎樣尋找變量 ? ? 在塊中使用變量時 , – PL/SQL 先在當前塊中尋找該變量 (局部變量 ). – 如果未找到 , PL/SQL 繼續(xù)在父塊中尋找 . – 如果還未找到 , PL/SQL 在父塊的父塊中尋找 (嵌套可有三層或更多層 ). – 依此類推 . ? 下例中有三層嵌套 . 68 home back first prev next last 三層嵌套示例 ? 每個變量的作用域是什么 ? 69 home back first prev next last 復習變量命名 ? 下面變量聲明對不對 ? 以上聲明合法,但在子塊中無法訪問父塊定義的變量 v_myvar. 70 home back first prev next last 復習變量命名 ? 變量 v_date_of_birth 聲明了兩次 . ? 語句中引用的是哪個 v_date_of_birth ? 71 home back first prev next last 復習變量可見范圍 ? 變量可見范圍是變量作用域中,不加限定符就可使用變量的部分 . –下面每個變量的可見范圍是什么 ? 72 home back first prev next last 復習變量可見范圍 ? 父塊的 v_date_of_birth 變量作用域包括子塊 . – 此變量在父塊中可見 . ?然而 ,該變量在子塊中不可見(被隱藏) ,因為子塊中有一個同名的局部變量 . – 變量 v_father_name 在父子塊中都可見 . – 變量 v_child_name 只在子塊中可見 . ? 怎樣才能在子塊中引用父塊定義的變量 v_date_of_birth 呢 ? 73 home back first prev next last 復習塊標簽 ? 可使用 … 語法為塊加標簽 . 然后通過標簽使用在作用域內但被隱藏的變量 . 下例中 , 父塊標簽為 outer. ? 不僅父塊,任何塊都可加標簽 . 74 home back first prev next last 通過塊標簽使用被隱藏變量 ? 通過使用標簽 outer 限定變量 v_date_of_birth, 在子塊中就可輸出顯示父親的生日了 . 75 home back first prev next last 嵌套塊中的異常處理 ? 異常處理方式有兩種 : –在發(fā)生異常的塊處理 (捕獲 ) 該異常 –將異常傳遞給調用環(huán)境 (比如其父塊 ) 76 home back first prev next last 傳播異常到父塊 ? 如果異常自子塊的執(zhí)行部分拋出,子塊無相應處理代碼 , PL/SQL 子塊以失敗結束, 異常傳遞給其父塊 . 77 home back first prev next last 傳播異常到父塊 ? 下例中 , 子塊執(zhí)行時產生了一個異常 . – 子塊 EXCEPTION 部分 沒有處理此異常 . – 子塊失敗結束, PL/SQL 將異常傳遞給父塊 . – 父塊 EXCEPTION 部分成功處理此異常 . 78 home back first prev next last 從子塊向外傳遞異常 ? 如果 PL/SQL 產生異常,而當前塊沒有捕獲該異常 – 異常連續(xù)傳遞給上層塊,直到找到相應異常處理程序 . – 異常傳遞給上層塊時,當前塊剩余執(zhí)行代碼被跳過,不再執(zhí)行 . – 這樣做的優(yōu)點是在塊中處理此塊可以處理的異常, 將更一般的異常處理 (如 WHEN OTHERS)交給上層塊去 . ? 下面是一個例子 . 79 home back first prev next last 從子塊向外傳遞預定義異常 ? 不存在編號 999 的員工 . 下面代碼執(zhí)行結果是什么 ? 80 home back first prev next last 從子塊向外傳遞用戶定義的異常 ? 下面代碼執(zhí)行結果怎樣 ? 81 home back first prev next last 異常名的作用域 ? 預定義 Oracle 服務異常如 NO_DATA_FOUND, TOO_MANY_ROWS (以及 OTHERS) 不需要用戶聲明 . – 可在任何塊中使用(拋出或捕獲) . ? 用戶命名的異常 (非預定義 Oracle 服務異常和 自定義異常 )是程序員定義的 EXCEPTION 類型的變量 – 其作用域和其它變量遵循相同規(guī)則 . – 因此 , 子塊聲明的自定義異常不能在父塊中使用 82 home back first prev next last 識別變量作用域 ? 此部分講解了: –描述在嵌套塊中變量的作用域 . –使用標簽限定嵌套塊中的變量 –描述異常的作用域 –識別嵌套塊中異常的作用域問題 –描述異常在嵌套塊中的傳播方式及其影響