• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 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

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>