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.')
当我调用此过程时,它会将错误状态设置为无效状态。
答案 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)你也错过了第二个'开始'的'结束'条款。