转换为PROCEDURE pl / sql

时间:2015-08-21 19:29:19

标签: oracle stored-procedures plsql procedure

我想编写一份程序,首先打印员工的员工编号和工资(即7839)。然后,它将根据以下条件增加员工7839(这将是表员工中的员工编号)的工资:

Condition-1: If experience is more than 10 years, increase salary by 20%.
Condition-2: If experience is greater than 5 years, increase salary by 10%.
Condition-3: All others will get an increase of 5% in the salary.

程序将在增加之前和之后打印员工编号和工资我尝试了以下步骤,但不确定它有多准确..

我需要将其转换为PROCEDURE代码。

请告知

 DECLARE
     veno  emp.empno%type:=&veno;
     vsal  emp.sal%type;
     vexp  number;
BEGIN
    select empno,sal,trunc(to_char(months_between(sysdate,hiredate)/12))into veno,vsal,vexp from emp where empno=veno;
DBMS_OUTPUT.PUT_LINE('before update:' ||chr(10)||veno||chr(10)||vsal);
    if vexp>=10 then
        update emp set sal=sal+(sal*.20) where empno=veno; 
        select sal into vsal from emp where empno=veno;
        DBMS_OUTPUT.PUT_LINE('after update:' ||chr(10)||vsal);
   elsif vexp>=5 then
        update emp set sal=sal+(sal*.10) where empno=veno;
        select sal into vsal from emp where empno=veno;
        DBMS_OUTPUT.PUT_LINE('after update:' ||chr(10)||vsal);
     else 
        update emp set sal=sal+(sal*.05) where empno=veno;
        select sal into vsal from emp where empno=veno;
        DBMS_OUTPUT.PUT_LINE('after update:' ||chr(10)||vsal);
   end if;
END;
/

1 个答案:

答案 0 :(得分:1)

您需要更改的是DECLARE(表示匿名阻止的开始)到CREATE PROCEDURE,您目前通过替换变量设置的变量作为正式参数;所以代替:

DECLARE
     veno  emp.empno%type:=&veno;
     vsal  emp.sal%type;
     vexp  number;
BEGIN
...
END;
/

成功:

CREATE OR REPLACE PROCEDURE my_proc (veno IN emp.empno%type)
AS
     vsal  emp.sal%type;
     vexp  number;
BEGIN
...
END;
/

然后,您可以使用execute简写从匿名块或SQL * Plus或SQL Developer中调用它:

set serveroutput on
execute my_proc(&veno);

此示例仍在使用替换变量,因此您可以提升要使用的值,但您也可以直接传递数字。

Read more about creating procedures以及parameters的类型。

您可以简化代码以减少重复和重新查询;查找case表达式和返回子句。但那并不直接相关。