PL/SQL Update命令未更新数据库中的记录
我已经写了下面的存储过程PL/SQL Update命令未更新数据库中的记录,sql,plsql,Sql,Plsql,我已经写了下面的存储过程 CREATE OR REPLACE PROCEDURE EmployeeProcedure (id IN NUMBER, name IN VARCHAR, salary IN NUMBER, stmt IN VARCHAR ) AS BEGIN IF stmt='INSERT' then INSERT INTO Employee(employee_id,name,salary) VALUES(id, name, salary); END IF; IF st
CREATE OR REPLACE PROCEDURE EmployeeProcedure
(id IN NUMBER, name IN VARCHAR, salary IN NUMBER,
stmt IN VARCHAR
) AS
BEGIN
IF stmt='INSERT' then
INSERT INTO Employee(employee_id,name,salary) VALUES(id, name, salary);
END IF;
IF stmt='UPDATE' then
update employee set name=name, salary=salary
where employee_id=id;
END IF;
IF stmt='DELETE' then
Delete from employee where employee_id=id;
END IF;
END EmployeeProcedure;
这是Employee表中可用的数据
EMPLOYEE_ID NAME SALARY TITLE
2 Ranjan 40000 Manager
3 Stella 5000 President
4 Fred 500 Janitor
10 Ranjan 3000 -
1 John 64876 -
当我使用以下语句执行此存储过程时
begin
EmployeeProcedure(10,'John',78987,'UPDATE');
end;
我正在处理对账单。但是没有更新员工id为10的记录。任何帮助都将不胜感激 不要使用与要更新的字段同名的变量 这不会有任何作用:
SET name = name, salary = salary
将变量设置为:
str_name, int_salary
那你就有
SET name = str_name, salary = int_salary
无论是在对过程的调用中,还是在过程本身中,我都看不到提交 如果您的执行是从您声明的匿名块运行的,请确保在之后发出commit 此外,正如Juan Carlos Oropeza所述,将参数与列同名已被证明是一种不好的做法,请附加字母“p”以区分参数与列名称,如下所示:
CREATE OR REPLACE PROCEDURE EmployeeProcedure
(p_id IN NUMBER, p_name IN VARCHAR, p_salary IN NUMBER,
p_stmt IN VARCHAR
) AS
BEGIN
IF p_stmt='INSERT' then
INSERT INTO Employee(employee_id,name,salary) VALUES(p_id, p_name, p_salary);
END IF;
IF p_stmt='UPDATE' then
update employee set name=p_name, salary=p_salary
where employee_id=p_id;
END IF;
IF p_stmt='DELETE' then
Delete from employee where employee_id=p_id;
END IF;
END EmployeeProcedure;
很高兴我帮了忙
关于在过程中使用“select”语句,我认为您必须做一些更改来实现返回值,因为在PL/SQL块中使用select语句是不可能的,除非您在显式/隐式游标中使用它
我想这样的事情可以做到:
create or replace PROCEDURE EmployeeProcedure(
p_id IN NUMBER,
p_name IN VARCHAR,
p_salary IN NUMBER,
p_stmt IN VARCHAR,
p_CURSOR in out SYS_REFCURSOR
) AS
BEGIN
IF p_stmt='INSERT' then
INSERT INTO Employee(employee_id,name,salary) VALUES(p_id, p_name, p_salary);
END IF;
IF p_stmt='UPDATE' then
update employee set name=p_name, salary=p_salary
where employee_id=p_id;
END IF;
IF p_stmt='DELETE' then
Delete from employee where employee_id=p_id;
END IF;
IF p_stmt='SELECT' then
/*open the explicit cursor*/
open p_cursor for
select *
from employee
where employee_id = p_id;
END IF;
END EmployeeProcedure;
然后你必须这样读取光标:
declare
cur SYS_REFCURSOR;
data_row employee%rowtype;
begin
EmployeeProcedure(1,null,null,'SELECT', cur);--opens cursor
loop
fetch cur into data_row; --reads one row
exit when cur%notfound; --exits when you reach the end of rows
--at this point you can access every row in your table.
dbms_output.put_line(data_row.employee_id);
end loop;
close cur; --always remember close every cursor you open to keep your DBA happy.
end;
只是为了确保:您在事务中的某个点提交,对吗?您正在使用哪个数据库?谢谢Jair,它现在正在工作。。如果p_stmt='SELECT'然后从employee中选择*,请您再帮我一个条件好吗;如果结束;我尝试了这段代码,但它不起作用。不客气,我在同一主题的另一个答案中发布了你新问题的答案,因为我的回答使用的字符数超过了评论中允许的字符数。你能帮助我使用聚合函数吗?当p_stmt=Insert/update/delete时,我如何运行查询?嗨@ranjanjaiswal抱歉,我不确定我是否理解您现在想要实现的目标。是否要通过传递p_stmt='insert/update/delete',在一个调用中允许多个操作?