Sql 如何使用%ROWTYPE执行更新存储过程

Sql 如何使用%ROWTYPE执行更新存储过程,sql,oracle,stored-procedures,plsql,Sql,Oracle,Stored Procedures,Plsql,如何使用%rowtype执行更新存储过程 PROCEDURE p_update ( p_id IN t.id%TYPE, p_row IN t%rowtype) IS BEGIN UPDATE t SET row = p_row WHERE id = p_id; END p_update; declare t_row t%rowtype; t_id t.id%type; begin t

如何使用%rowtype执行更新存储过程

PROCEDURE p_update (
    p_id     IN   t.id%TYPE,
    p_row    IN   t%rowtype) 
IS
BEGIN
    UPDATE t
    SET
        row = p_row
    WHERE
        id = p_id; 
END p_update;

declare 
t_row   t%rowtype;
t_id    t.id%type;
begin
t_row.name := 'TEST';
t_id := 10;
pck_api.p_update(t_row, t_id);
end;

我得到了PLS-00306错误的参数数量或类型

您只需在存储过程的更新指令中添加
名称
列到您的行类型(
p_行
)参数
p_行。名称
,并在调用存储过程时更改参数顺序:

CREATE OR REPLACE PROCEDURE p_update (
    p_id     IN   t.id%TYPE,
    p_row    IN   t%rowtype) 
IS
BEGIN
  update t set name = p_row.name where id=p_id;
END;
/


Declare 
 t_row   t%rowtype;
 t_id    t.id%type;
Begin
 t_row.name := 'Test';
 t_id := 10;
 p_update(t_id,t_row);
End;
/

您只需在存储过程的更新语句中添加
name
列到rowtype(
p\u row
)参数
p\u row.name
,并在调用存储过程时更改参数顺序:

CREATE OR REPLACE PROCEDURE p_update (
    p_id     IN   t.id%TYPE,
    p_row    IN   t%rowtype) 
IS
BEGIN
  update t set name = p_row.name where id=p_id;
END;
/


Declare 
 t_row   t%rowtype;
 t_id    t.id%type;
Begin
 t_row.name := 'Test';
 t_id := 10;
 p_update(t_id,t_row);
End;
/

谢谢。但是,我想使用存储过程
p_update
是一个存储过程,你是什么意思?@WernfriedDomscheit我想,我已经修正了我的解释。现在工作正常了。但是,在过程中,我有一个用于更新所有列的
update t set ROW
,如何避免这种情况,并保持
set ROW
语句已经有where限制。你能用一个例子来详细说明一下吗@Pavloss04谢谢。但是,我想使用存储过程
p_update
是一个存储过程,你是什么意思?@WernfriedDomscheit我想,我已经修正了我的解释。现在工作正常了。但是,在过程中,我有一个用于更新所有列的
update t set ROW
,如何避免这种情况,并保持
set ROW
语句已经有where限制。您能否以@Pavlos04为例详细说明您的过程接受id作为第一个参数,记录作为第二个参数,但是在匿名块中,您将记录作为第一个参数传递,将id作为第二个参数传递是,这是错误的。您的过程接受id作为第一个参数,将记录作为第二个参数传递,但是在匿名块中,您将记录作为第一个参数传递,将id作为第二个参数传递是,这是一个错误。