1. 程式人生 > >Oracle入門(十四.13)之帶引數的遊標

Oracle入門(十四.13)之帶引數的遊標

一、帶引數的遊標

    引數是一個變數,其名稱用於遊標宣告中。 當遊標開啟時,引數值被傳遞給Oracle伺服器,Oracle伺服器使用它來決定要將哪些行檢索到游標的活動集中。

    這意味著您可以在塊中多次開啟和關閉顯式游標,或者在同一個塊的不同執行中開啟和關閉顯式游標,每次都返回一個不同的活動集。

    考慮將任何region_id傳遞給遊標的示例,並返回該區域中國家/地區的名稱。

例子

DECLARE
 CURSOR c_country (p_region_id NUMBER) IS
 SELECT country_id, country_name
 FROM wf_countries
 WHERE region_id = p_region_id;
 v_country_record c_country%ROWTYPE;
BEGIN
 OPEN c_country (5);  --更改為需要的區域。
 LOOP
 FETCH c_country INTO v_country_record;
 EXIT WHEN c_country%NOTFOUND;
 DBMS_OUTPUT.PUT_LINE(v_country_record.country_id
 || ' ' || v_country_record.country_name);
 END LOOP;
 CLOSE c_country;
END;

二、引數遊標用法

(1)使用引數語法定義遊標

在遊標宣告中命名的每個引數在OPEN語句中必須具有對應的值。 引數資料型別與標量變數的資料型別相同,但不給它們大小。 引數名稱在遊標SELECT語句的WHERE子句中使用。

CURSOR cursor_name
 [(parameter_name datatype, ...)]
IS
 select_statement;
在語法中:
cursor_name是宣告的遊標的PL / SQL識別符號
•parameter_name是引數的名稱
•資料型別是引數的標量資料型別

•select_statement是一個沒有INTO子句的SELECT語句

用引數開啟遊標

以下是用引數開啟遊標的語法:

OPEN cursor_name(parameter_value,.....) ;

(2)帶引數的遊標

遊標開啟時將引數值傳遞給遊標。 因此,您可以多次開啟一個顯式游標並每次獲取一個不同的活動集。 在以下示例中,遊標會多次開啟。


具有引數的游標的另一個例子

DECLARE
v_deptid employees.department_id%TYPE;
CURSOR empcur (p_deptid NUMBER) IS
 SELECT employee_id, salary
 FROM employees
 WHERE department_id = p_deptid;
v_emp_rec empcur%ROWTYPE;
BEGIN
SELECT MAX(department_id) INTO v_deptid
 FROM employees;
OPEN empcur(v_deptid);
LOOP
 FETCH empcur INTO v_emp_rec;
 EXIT WHEN empcur%NOTFOUND;
 DBMS_OUTPUT.PUT_LINE(v_emp_rec.employee_id
 || ' ' || v_emp_rec.salary);
END LOOP;
CLOSE empcur;
END;

(3)游標FOR迴圈引數

如果需要,我們可以使用遊標FOR迴圈:

DECLARE
 CURSOR emp_cursor (p_deptno NUMBER) IS
 SELECT employee_id, last_name
 FROM employees
 WHERE department_id = p_deptno;
BEGIN
 FOR v_emp_record IN emp_cursor(10) LOOP
 ….
 END LOOP;
END;

(4)具有多個引數的遊標

在下面的例子中,聲明瞭一個遊標並用兩個引數呼叫:

DECLARE
 CURSOR countrycursor2 (p_region_id NUMBER,
 p_population NUMBER) IS
 SELECT country_id, country_name, population
 FROM wf_countries
 WHERE region_id = p_region_id
 OR population > p_population;
BEGIN
 FOR v_country_record IN countrycursor2(145,10000000) LOOP
DBMS_OUTPUT.PUT_LINE(v_country_record.country_id ||' '
 || v_country_record. country_name||' '||
v_country_record.population);
END LOOP;
END;
另一個例子
該游標可以獲取所有收入超過10000美元的IT程式設計師。
DECLARE
 CURSOR emp_cursor3 (p_job VARCHAR2,
 p_salary NUMBER) IS
 SELECT employee_id, last_name
 FROM employees
 WHERE job_id = p_job
 AND salary > p_salary;
BEGIN
 FOR v_emp_record IN emp_cursor3('IT_PROG', 10000) LOOP
   DBMS_OUTPUT.PUT_LINE(v_emp_record.employee_id ||' ' ||v_emp_record.last_name);
 END LOOP;
END;