写一个函数,oracle自带的emp表。要求:传入的参数是两个工资的值,比如传入2000和3000.把2000《= 工资《=3000的empno,ename,sal输出。工资小于2000的,则输出“你的工资太低了!”,如大于3000的,则输出“你的工资不错!”。请写出代码让小弟学习调试调试,谢谢!

解决方案 »

  1.   

    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;
      

  2.   

    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>
      

  3.   

    应该用存储过程而不是函数,代码为: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)
      

  4.   

    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;
      

  5.   

    问你#5楼的,你的c_emp是游标吗?
      

  6.   

    用一条sql不行吗??  干嘛要用存储过程
      

  7.   

    问你#5楼的,你的c_emp是游标吗?