--===============帶參數的游標==================--
DECLARE
dept_code emp.deptno%TYPE; --聲明列類型變量三個
emp_code emp.empno%TYPE;
emp_name emp.ename%TYPE;
CURSOR emp_cur(deptparam NUMBER) IS
SELECT empno, ename FROM EMP WHERE deptno = deptparam; --聲明顯示游標
BEGIN
dept_code := &部門編號; --請用戶輸入想查看的部門編號
OPEN emp_cur(dept_code); --打開游標
LOOP
--死循環
FETCH emp_cur
INTO emp_code, emp_name; --提取游標值賦給上面聲明的變量
EXIT WHEN emp_cur%NOTFOUND; --如果游標裡沒有數據則退出循環
DBMS_OUTPUT.PUT_LINE(emp_code || '' || emp_name); --輸出查詢
END LOOP;
CLOSE emp_cur; --關閉游標
END;
--=================REF游標==================--
ACCEPT tab FROMPT '你想查看什麼信息?員工(E)或部門信息(D):'; --使用ACCEPT命令彈出對話框讓用戶輸入數據
DECLARE
TYPE refcur_t IS REF CURSOR; --聲明REF游標類型
refcur refcur_t; --聲明REF游標類型的變量
pid NUMBER;
p_name VARCHAR2(100);
selection VARCHAR2(1) := UPPER(SUBSTR('&tab', 1, 1)); --截取用戶輸入的字符串並轉換為大寫
BEGIN
IF selection = 'E' THEN
--如果輸入的是'E',則打開refcurr游標,並將員工表查詢出來賦值給此游標
OPEN refcur FOR
SELECT EMPNO ID, ENAME NAME FROM EMP;
DBMS_OUTPUT.PUT_LINE('=====員工信息=====');
ELSIF selection = 'D' THEN
--如果輸入是'D',則打開部門表
OPEN refcur FOR
SELECT deptno id, dname name FROM DEPT;
DBMS_OUTPUT.PUT_LINE('=====部門信息======');
ELSE
--否則返回結束
DBMS_OUTPUT.PUT_LINE('請輸入員工信息(E)或部門信息(D)');
RETURN;
END IF;
FETCH refcur
INTO pid, p_name; --提取行
WHILE refcur%FOUND LOOP
DBMS_OUTPUT.PUT_LINE('#' || pid || ':' || p_name);
FETCH refcur
INTO pid, p_name;
END LOOP;
CLOSE refcur; --關閉游標
END;
--===================動態SQL=================--
VARIABLE maxsal NUMBER; --聲明變量
EXECUTE :maxsal := 2500; --執行引用並給變量賦值
DECLARE
r_emp EMP%ROWTYPE; --聲明一個行類型變量
TYPE c_type IS REF CURSOR; --聲明REF游標類型
cur c_type; --聲明REF游標類型的變量
p_salary NUMBER; --聲明一個標量變量
BEGIN
p_salary := :maxsal; --引用變量
--使用USING語句將引用到的值傳給動態SQL語句'SAL >: 1'中的'1'
OPEN cur FOR 'SELECT * FROM EMP WHERE SAL >: 1 ORDER BY SAL DESC'
USING p_salary;
DBMS_OUTPUT.PUT_LINE('薪水大於' || p_salary || '的員工有:');
LOOP
FETCH cur
INTO r_emp;
EXIT WHEN cur%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('編號:' || r_emp.empno || '姓名:' || r_emp.ename ||
'薪水:' || r_emp.sal);
END LOOP;
CLOSE cur; --關閉游標
END;