Oracle入门(十四.17)之procedure传递参数
一、PROCEDURE?參數模式
參數模式在形式參數聲明中指定,位于參數名稱之后,位于其數據類型之前。參數傳遞模式:
?IN參數(默認值)為子程序提供處理值。
?OUT參數將值返回給調用者。
?IN OUT參數提供一個輸入值,該值可以作為修改值返回(輸出)。
二、默認模式:IN
如果沒有指定模式,IN模式是默認模式。 IN參數只能在程序中讀取。 他們不能被修改。
三、使用OUT參數
例子
CREATE OR REPLACE PROCEDURE query_emp (p_id IN employees.employee_id%TYPE,p_name OUT employees.last_name%TYPE,p_salary OUT employees.salary%TYPE) IS BEGINSELECT last_name, salary INTO p_name, p_salaryFROM employeesWHERE employee_id = p_id; END query_emp; DECLAREa_emp_name employees.last_name%TYPE;a_emp_sal employees.salary%TYPE; BEGINquery_emp(178, a_emp_name, a_emp_sal); ... END;(1)使用前面的OUT例子使用OUT參數創建一個過程來檢索有關員工的信息。 該過程接受員工ID的值178,并將ID 178的員工的姓名和薪水檢索到兩個OUT參數。
query_emp過程有三個形式參數。 其中兩個參數是OUT參數,將值返回給調用環境,如上一張幻燈片底部的代碼框中所示。
該過程通過p_id參數接受員工ID值。 a_emp_name和a_emp_sal變量用從查詢中檢索到的信息填充到它們的兩個相應的OUT參數中。
確保用于從OUT參數檢索值的實際參數變量的數據類型具有足夠大的尺寸以保存數據值回。
(2)在Application Express中查看OUT參數
使用通過調用DBMS_OUTPUT.PUT_LINE過程顯示的PL / SQL變量。
Name: Grant
Salary: 7700
四、使用IN OUT參數
例子
(1)使用前面 IN OUT例子
使用IN OUT參數,您可以將值傳遞到可以在過程中更新的過程。從調用環境提供的實際參數值可以返回為以下任一值:?原始未改變的值
?過程中設置的新值
上面的示例使用IN OUT參數創建一個過程,以接受包含電話號碼數字的10個字符的字符串。 該過程返回前三個字符前后括號格式化的電話號碼和第六個數字后的連字符。 例如,電話字符串'8006330575'返回為'(800)633-0575'。
(2)調用前面 IN OUT例子
以下代碼創建一個聲明a_phone_no的匿名塊,為其分配未格式化的電話號碼,并將其作為實際參數傳遞給FORMAT_PHONE過程。 該過程被執行并返回a_phone_no變量中的更新字符串,然后顯示該字符串。
DECLAREa_phone_no VARCHAR2(13); BEGINa_phone_no := '8006330575' ;format_phone (a_phone_no);DBMS_OUTPUT.PUT_LINE('The formatted phone number is: '|| a_phone_no); END;五、參數模式總結
(1)傳遞參數的語法
從呼叫環境傳遞參數有三種方式:
?定位:按照與形式參數相同的順序列出實際參數
?命名:以任意順序列出實際參數,并使用關聯運算符('=>',它是一個等號和一個箭頭)將一個指定形式參數與其實際參數
?組合:列出一些實際參數為位置(無特殊操作符)和一些命名(使用=>操作符)。
參數傳遞示例
CREATE OR REPLACE PROCEDURE add_dept(p_name IN my_depts.department_name%TYPE,p_loc IN my_depts.location_id%TYPE) IS BEGININSERT INTO my_depts(department_id,department_name, location_id)VALUES (departments_seq.NEXTVAL, p_name, p_loc); END add_dept;(2)通過位置符號傳遞
add_dept ('EDUCATION', 1400);(3)通過命名符號傳遞
add_dept (p_loc=>1400, p_name=>'EDUCATION'); CREATE OR REPLACE PROCEDURE add_dept(p_name IN my_depts.department_name%TYPE,p_loc IN my_depts.location_id%TYPE) IS BEGININSERT INTO my_depts(department_id,department_name, location_id)VALUES (departments_seq.NEXTVAL, p_name, p_loc); END add_dept; (4)通過組合符號傳遞add_dept ('EDUCATION', p_loc=>1400);
下面的調用會成功執行嗎?
add_dept (p_loc => 1400, 'EDUCATION');答案:否,因為在使用組合表示法時,位置表示法參數必須在命名表示法參數之前列出。
下面的調用會成功執行嗎?
答案:不可以。您必須為每個參數提供一個值,除非正式參數被分配了默認值。但是如果你真的想省略一個實際的參數,或者你不知道參數的值呢?接下來討論指定形式參數的默認值。
六、使用IN參數的DEFAULT選項
可以為正式的IN參數分配一個默認值。 這在傳遞參數時提供了靈活性。
CREATE OR REPLACE PROCEDURE add_dept( p_name my_depts.department_name%TYPE:='Unknown', p_loc my_depts.location_id%TYPE DEFAULT 1400) IS BEGININSERT INTO my_depts (...)VALUES (departments_seq.NEXTVAL, p_name, p_loc); END add_dept;(1)上面的代碼顯示了給IN參數分配默認值的兩種方法。?
顯示的兩種方式使用:
?賦值運算符(:=),如p_name參數所示?DEFAULT選項,如p_loc參數所示
(2)使用參數的DEFAULT選項
以下是調用add_dept過程的三種方法:?第一個示例為每個參數分配默認值。
?第二個例子說明了位置和命名符號的組合以分配值。 在這種情況下,使用命名符號作為示例。
?最后一個示例使用name參數的缺省值和p_loc參數的提供值。
add_dept; add_dept ('ADVERTISING', p_loc => 1400); add_dept (p_loc => 1400);(3)使用參數DEFAULT選項的準則
?您不能將默認值分配給標題中的OUT和IN OUT參數,但可以在過程的主體中。
?通常,您可以使用命名符號來覆蓋形式參數的默認值。 但是,如果沒有為形式參數提供默認值,則不能跳過提供實際參數。
?繼承DEFAULT值的參數與NULL不同。
注意:所有位置參數應在子程序調用中的指定參數之前。 否則,您會收到一條錯誤消息,如以下示例所示:
BEGINadd_dept (name =>'new dept', 'new location'); END;生成以下錯誤消息:
ORA-06550: line 2, column 33: PLS-00312: a positional parameter association may not follow a named association ORA-06550: line 2, column 6: PL/SQL: Statement ignored 1. BEGIN 2. add_dept(name=>'new dept', 'new location'); 3. END;總結
以上是生活随笔為你收集整理的Oracle入门(十四.17)之procedure传递参数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OPPO Find X6 系列手机再开启
- 下一篇: Oracle入门(十四.19)之触发器简