Oracle游標使用大全

發表于:2013-06-04來源:Csdn作者:scorpio3k點擊數: 標簽:oracle
從游標提取數據 從游標得到一行數據使用FETCH命令。每一次提取數據后,游標都指向結果集的下一行。語法如下: FETCH cursor_name INTO variable[,variable,...] 對于SELECT定義的游標的每一列,FETCH變量列表都應該有一個變量與之相

  從游標提取數據

  從游標得到一行數據使用FETCH命令。每一次提取數據后,游標都指向結果集的下一行。語法如下:

  FETCH cursor_name INTO variable[,variable,...]

  對于SELECT定義的游標的每一列,FETCH變量列表都應該有一個變量與之相對應,變量的類型也要相同。

  例:

  SET SERVERIUTPUT ON

  DECLARE

  v_ename EMP.ENAME%TYPE;

  v_salary EMP.SALARY%TYPE;

  CURSOR c_emp IS SELECT ename,salary FROM emp;

  BEGIN

  OPEN c_emp;

  FETCH c_emp INTO v_ename,v_salary;

  DBMS_OUTPUT.PUT_LINE('Salary of Employee'|| v_ename ||'is'|| v_salary);

  FETCH c_emp INTO v_ename,v_salary;

  DBMS_OUTPUT.PUT_LINE('Salary of Employee'|| v_ename ||'is'|| v_salary);

  FETCH c_emp INTO v_ename,v_salary;

  DBMS_OUTPUT.PUT_LINE('Salary of Employee'|| v_ename ||'is'|| v_salary);

  CLOSE c_emp;

  END

  這段代碼無疑是非常麻煩的,如果有多行返回結果,可以使用循環并用游標屬性為結束循環的條件,以這種方式提取數據,程序的可讀性和簡潔性都大為提高,下面我們使用循環重新寫上面的程序:

  SET SERVERIUTPUT ON

  DECLARE

  v_ename EMP.ENAME%TYPE;

  v_salary EMP.SALARY%TYPE;

  CURSOR c_emp IS SELECT ename,salary FROM emp;

  BEGIN

  OPEN c_emp;

  LOOP

  FETCH c_emp INTO v_ename,v_salary;

  EXIT WHEN c_emp%NOTFOUND;

  DBMS_OUTPUT.PUT_LINE('Salary of Employee'|| v_ename ||'is'|| v_salary);

  END

  記錄變量

  定義一個記錄變量使用TYPE命令和%ROWTYPE,關于%ROWsTYPE的更多信息請參閱相關資料。

  記錄變量用于從游標中提取數據行,當游標選擇很多列的時候,那么使用記錄比為每列聲明一個變量要方便得多。

  當在表上使用%ROWTYPE并將從游標中取出的值放入記錄中時,如果要選擇表中所有列,那么在SELECT子句中使用*比將所有列名列出來要得多。

  例:

  SET SERVERIUTPUT ON

  DECLARE

  R_emp EMP%ROWTYPE;

  CURSOR c_emp IS SELECT * FROM emp;

  BEGIN

  OPEN c_emp;

  LOOP

  FETCH c_emp INTO r_emp;

  EXIT WHEN c_emp%NOTFOUND;

  DBMS_OUT.PUT.PUT_LINE('Salary of Employee'||r_emp.ename||'is'|| r_emp.salary);

  END LOOP;

  CLOSE c_emp;

  END;

  %ROWTYPE也可以用游標名來定義,這樣的話就必須要首先聲明游標:

  SET SERVERIUTPUT ON

  DECLARE

  CURSOR c_emp IS SELECT ename,salary FROM emp;

  R_emp c_emp%ROWTYPE;

  BEGIN

  OPEN c_emp;

  LOOP

  FETCH c_emp INTO r_emp;

  EXIT WHEN c_emp%NOTFOUND;

  DBMS_OUT.PUT.PUT_LINE('Salary of Employee'||r_emp.ename||'is'|| r_emp.salary);

  END LOOP;

  CLOSE c_emp;

  END;

  帶參數的游標

  與存儲過程和函數相似,可以將參數傳遞給游標并在查詢中使用。這對于處理在某種條件下打開游標的情況非常有用。它的語法如下:

  CURSOR cursor_name[(parameter[,parameter],...)] IS select_statement;

  定義參數的語法如下:

  Parameter_name [IN] data_type[{:=|DEFAULT} value]

  與存儲過程不同的是,游標只能接受傳遞的值,而不能返回值。參數只定義數據類型,沒有大小。

  另外可以給參數設定一個缺省值,當沒有參數值傳遞給游標時,就使用缺省值。游標中定義的參數只是一個占位符,在別處引用該參數不一定可靠。

  在打開游標時給參數賦值,語法如下:

  OPEN cursor_name[value[,value]....];

  參數值可以是文字或變量。

  例:

  DECALRE

  CURSOR c_dept IS SELECT * FROM dept ORDER BY deptno;

  CURSOR c_emp (p_dept VARACHAR2) IS

  SELECT ename,salary

  FROM emp

  WHERE deptno=p_dept

  ORDER BY ename

  r_dept DEPT%ROWTYPE;

  v_ename EMP.ENAME%TYPE;

  v_salary EMP.SALARY%TYPE;

  v_tot_salary EMP.SALARY%TYPE;

  BEGIN

  OPEN c_dept;

  LOOP

  FETCH c_dept INTO r_dept;

  EXIT WHEN c_dept%NOTFOUND;

  DBMS_OUTPUT.PUT_LINE('Department:'|| r_dept.deptno||'-'||r_dept.dname);

  v_tot_salary:=0;

  OPEN c_emp(r_dept.deptno);

  LOOP

  FETCH c_emp INTO v_ename,v_salary;

  EXIT WHEN c_emp%NOTFOUND;

  DBMS_OUTPUT.PUT_LINE('Name:'|| v_ename||' salary:'||v_salary);

  v_tot_salary:=v_tot_salary+v_salary;

  END LOOP;

  CLOSE c_emp;

  DBMS_OUTPUT.PUT_LINE('Toltal Salary for dept:'|| v_tot_salary);

  END LOOP;

  CLOSE c_dept;

原文轉自:http://blog.csdn.net/scorpio3k/article/details/4098765

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97