create or replace procedure func_check_salary(v_min_sal number,v_max_sal number, cur_result out sys_refcursor) is
begin open cur_result for 'select case when sal<:1 then :2 when sal>:3 then :4 else :5 end out_result from emp ' using v_min_sal,'你的工资太低了!',v_max_sal,'你的工资不错!', '正常工资水平!' end;
SQL> CREATE OR REPLACE FUNCTION test_sal 2 (pi_sal1 emp.sal%TYPE, 3 pi_sal2 emp.sal%TYPE 4 ) 5 RETURN SYS_REFCURSOR 6 IS 7 v_sqlstr VARCHAR2(250); 8 po_result SYS_REFCURSOR; 9 10 BEGIN 11 v_sqlstr := 'SELECT empno||''号雇员''||ename||CASE '|| 12 'WHEN sal BETWEEN '||pi_sal1||' AND '||pi_sal2||' THEN ''工 资为:''||sal '|| 13 'WHEN sal<'||pi_sal1||' THEN '':您的工资太低了! '''|| 14 'WHEN sal>'||pi_sal2||' THEN '':您的工资还不错。别骄傲,继 续努力!'''|| 15 'END 工资评论 FROM emp'; 16 OPEN po_result FOR v_sqlstr; 17 RETURN po_result; 18 END; 19 /函数已创建。SQL> select test_sal(2000,3000) from dual;TEST_SAL(2000,3000) -------------------- CURSOR STATEMENT : 1CURSOR STATEMENT : 1工资评论 ------------------------------------------------------------------------------7369号雇员SMITH:您的工资太低了! 7499号雇员ALLEN:您的工资太低了! 7521号雇员WARD:您的工资太低了! 7566号雇员JONES工资为:2975 7654号雇员MARTIN:您的工资太低了! 7698号雇员BLAKE工资为:2850 7782号雇员CLARK工资为:2450 7788号雇员SCOTT工资为:3000 7839号雇员KING:您的工资还不错。别骄傲,继续努力! 7844号雇员TURNER:您的工资太低了! 7876号雇员ADAMS:您的工资太低了!工资评论 ------------------------------------------------------------------------------7900号雇员JAMES:您的工资太低了! 7902号雇员FORD工资为:3000 7934号雇员MILLER:您的工资太低了!已选择14行。 SQL>
应该用存储过程而不是函数,代码为:CREATE OR REPLACE PROCEDURE print_sal(p_min NUMBER, p_max NUMBER) AS BEGIN FOR c_emp IN (SELECT empno, ename, sal FROM emp) LOOP IF c_emp.sal < 2000 THEN DBMS_OUTPUT.PUT_LINE('你的工资太低了!'); ELSIF c_emp.sal BETWEEN 2000 AND 3000 THEN DBMS_OUTPUT.PUT_LINE(c_emp.empno||','||c_emp.ename||','||c_emp.sal); ELSE DBMS_OUTPUT.PUT_LINE('你的工资不错!'); END IF; END LOOP; END; / 调用方式,在SQL*PLUS中 SQL>SET SERVEROUTPUT ON SQL>EXECUTE PRINT_SAL(2000,3000)
CREATE OR REPLACE PROCEDURE P_DBMS (SAL_STR VARCHAR2, SAL_END VARCHAR2) AS BEGIN FOR C IN(SELECT * FROM EMPLOYEE) LOOP IF C.SAL>SAL_END THEN DBMS_OUTPUT.PUT_LINE('你的工资不错'); ELSIF C.SAL<SAL_STR THEN DBMS_OUTPUT.PUT_LINE('你的工资太低了'); ELSE DBMS_OUTPUT.PUT_LINE(C.EMPNO||','||C.ENAME||','||C.SAL); END IF; END LOOP; END;
is
begin
open cur_result for 'select case when sal<:1 then :2 when sal>:3 then :4 else :5 end out_result
from emp ' using v_min_sal,'你的工资太低了!',v_max_sal,'你的工资不错!', '正常工资水平!'
end;
2 (pi_sal1 emp.sal%TYPE,
3 pi_sal2 emp.sal%TYPE
4 )
5 RETURN SYS_REFCURSOR
6 IS
7 v_sqlstr VARCHAR2(250);
8 po_result SYS_REFCURSOR;
9
10 BEGIN
11 v_sqlstr := 'SELECT empno||''号雇员''||ename||CASE '||
12 'WHEN sal BETWEEN '||pi_sal1||' AND '||pi_sal2||' THEN ''工
资为:''||sal '||
13 'WHEN sal<'||pi_sal1||' THEN '':您的工资太低了! '''||
14 'WHEN sal>'||pi_sal2||' THEN '':您的工资还不错。别骄傲,继
续努力!'''||
15 'END 工资评论 FROM emp';
16 OPEN po_result FOR v_sqlstr;
17 RETURN po_result;
18 END;
19 /函数已创建。SQL> select test_sal(2000,3000) from dual;TEST_SAL(2000,3000)
--------------------
CURSOR STATEMENT : 1CURSOR STATEMENT : 1工资评论
------------------------------------------------------------------------------7369号雇员SMITH:您的工资太低了!
7499号雇员ALLEN:您的工资太低了!
7521号雇员WARD:您的工资太低了!
7566号雇员JONES工资为:2975
7654号雇员MARTIN:您的工资太低了!
7698号雇员BLAKE工资为:2850
7782号雇员CLARK工资为:2450
7788号雇员SCOTT工资为:3000
7839号雇员KING:您的工资还不错。别骄傲,继续努力!
7844号雇员TURNER:您的工资太低了!
7876号雇员ADAMS:您的工资太低了!工资评论
------------------------------------------------------------------------------7900号雇员JAMES:您的工资太低了!
7902号雇员FORD工资为:3000
7934号雇员MILLER:您的工资太低了!已选择14行。
SQL>
BEGIN
FOR c_emp IN (SELECT empno, ename, sal FROM emp) LOOP
IF c_emp.sal < 2000 THEN
DBMS_OUTPUT.PUT_LINE('你的工资太低了!');
ELSIF c_emp.sal BETWEEN 2000 AND 3000 THEN
DBMS_OUTPUT.PUT_LINE(c_emp.empno||','||c_emp.ename||','||c_emp.sal);
ELSE
DBMS_OUTPUT.PUT_LINE('你的工资不错!');
END IF;
END LOOP;
END;
/
调用方式,在SQL*PLUS中
SQL>SET SERVEROUTPUT ON
SQL>EXECUTE PRINT_SAL(2000,3000)
(SAL_STR VARCHAR2,
SAL_END VARCHAR2)
AS
BEGIN
FOR C IN(SELECT * FROM EMPLOYEE) LOOP
IF C.SAL>SAL_END
THEN
DBMS_OUTPUT.PUT_LINE('你的工资不错');
ELSIF C.SAL<SAL_STR
THEN DBMS_OUTPUT.PUT_LINE('你的工资太低了');
ELSE DBMS_OUTPUT.PUT_LINE(C.EMPNO||','||C.ENAME||','||C.SAL);
END IF;
END LOOP;
END;