Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PL/SQL Update命令未更新数据库中的记录_Sql_Plsql - Fatal编程技术网

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',在一个调用中允许多个操作?