甲骨文:更新数据

Oracle : Update data

我如何使用这些过程参数更新数据。

 1. p_id_book IN NUMBER;
 2. p_column_name VARCHAR2;
 3. p_value VARCAHR2;

如果我尝试这样更新:

CREATE OR REPLACE PROCEDURE uptade_book(p_id_book IN NUMBER,
   p_column varchar2, p_value varchar2)
AS
  begin  
    UPDATE book SET  p_column = p_value WHERE id_book = p_id_book;
  END;

发生这些错误:

PL/SQL: SQL Statement ignored.

PL/SQL: ORA-00904: "p_column: invalid identifier.

有什么想法吗?

我不知道你的 book table 的结构,但是你的程序中发生了什么错误显示给你:

PL/SQL: SQL 语句被忽略:您试图执行无效的 PLSQL 代码块(如存储过程或函数),但发生了编译错误。

Oracle / PLSQL: ORA-06550 Error Message

PL/SQL: ORA-00904: “p_column: 无效标识符:您试图执行包含无效列名或列名丢失的 SQL 语句。这当您在 SELECT 语句中引用无效别名时通常会发生这种情况。

Oracle / PLSQL: ORA-00904 Error Message

为此,您需要动态 sql。更新可能是 运行 EXECUTE IMMEDIATE。对引用列名的参数使用 <column>%type 是一个好习惯。

CREATE OR replace PROCEDURE update_book(p_id_book book.id_book%TYPE,
                                        p_column  VARCHAR2,
                                        p_value   VARCHAR2)
AS
BEGIN
    EXECUTE IMMEDIATE 'UPDATE book SET  '||p_column||' = :p_value 
    WHERE id_book = :p_id_book'
    USING p_value, p_id_book;
END; 

这里需要注意的重要一点是,由于 p_value 被定义为 VARCHAR2,因此如果您传递字符串或数字,它会正常工作。对于 datetimestamp 类型,您应该特别注意传递正确的格式。特别是如果您传递字符串(而不是日期),以避免由于隐式转换而导致的错误。