oracle中存储过程执行出错

时间:2014-07-01 11:13:22

标签: sql oracle stored-procedures

create  procedure proc_insert_salary(salary_emp in NUMBER, 
                                     empid in NUMBER(10), 
                                     desig in varchar2(20))
begin
DECLARE
    gr_sal,hr,da,pf number;
BEGIN
    set hr:= salary_emp*(15/100);
    set da:= salary_emp*(8/100);
    set pf := salary_emp*(35/100);
    set gr_sal := salary_emp+hr+da-pf;
    insert into emp_salary_details values (empid,desig, salary_emp, gr_sal);
end;

call proc_insert_salary (45000,10100,'C.E.O.')

当我调用此过程时,它会将错误状态设置为无效状态。

2 个答案:

答案 0 :(得分:2)

虽然@ Guneli的答案是充分的,但在这种情况下,第二块确实没有理由。以下内容相同(稍微简单)。

CREATE OR REPLACE PROCEDURE proc_insert_salary (salary_emp IN NUMBER,
                                                empid IN NUMBER,
                                                desig IN VARCHAR2) AS
   hr NUMBER := salary_emp * (15 / 100);
   da NUMBER := salary_emp * (8 / 100);
   pf NUMBER := salary_emp * (35 / 100);
   gr_sal NUMBER := salary_emp + hr + da - pf;
BEGIN    
   INSERT INTO emp_salary_details
   VALUES      (empid,
                desig,
                salary_emp,
                gr_sal);
END;
/

此外,如果您要在同一个脚本中使用任何其他SQL(例如call),则不应该这样做,那么您需要使用斜杠(/)结束过程定义。这告诉Oracle程序已完成并且应该编译它。实际上,在程序代码之后始终包含它是一个好习惯。

答案 1 :(得分:1)

好吧,试试这个:

CREATE OR REPLACE PROCEDURE proc_insert_salary(
    salary_emp IN NUMBER,
    empid      IN NUMBER,
    desig      IN VARCHAR2)
AS
BEGIN
  DECLARE
    gr_sal NUMBER;
    hr     NUMBER;
    da     NUMBER;
    pf     NUMBER;
  BEGIN
    hr     := salary_emp*(15/100);
    da     := salary_emp*(8/100);
    pf     := salary_emp*(35/100);
    gr_sal := salary_emp+hr+da-pf;
    INSERT INTO emp_salary_details VALUES (empid,desig, salary_emp, gr_sal);
  END;
END;

需要注意的是:

1)您无法在PL / SQL中显示子程序参数的大小,因此NUMBER(10)或VARCHAR2(20)不正确。

2)PL / SQL不支持变量的一行声明,因此应使用

代替gr_sal,hr,da,pf number;
gr_sal NUMBER;
hr     NUMBER;
da     NUMBER;
pf     NUMBER;

3)要为变量赋值,不应使用SET,':='就足够了。

4)你也错过了第二个'开始'的'结束'条款。