sql - 我应该为我单独更新的每个数据库 table.column 编写一个完整的过程吗?

标签 sql ajax oracle plsql

我有一个大量使用 AJAX 的应用程序。我有几个地方正在为用户正在编辑的记录更新单个数据库列。

到目前为止,我一直在为每个 AJAX 操作创建单独的存储过程...所以我有 UPDATE_NAME、UPDATE_ADDRESS、UPDATE_PHONE 存储过程。

我只是想知道是否有更好的方法来继续使用存储过程,但无需为每一列创建一个存储过程。

如果可能,我想避免反射(reflect)指定列的字符串参数。 IE。我知道我可以有一个 UPDATE_COLUMN 过程,它将列名作为其参数之一。这种做法让我胆战心惊,但如果这是唯一的方法,那么我可能会多加考虑。但并非所有列都具有相同的数据类型,因此这看起来不像是 Elixir 。

最佳答案

考虑编写一个接受多个列的更新过程,并对所有非强制性列(如其他人所建议的)使用 DEFAULT NULL

在更新中使用 NVL 将只更新您提供的列。这种方法的唯一问题是,您不能将值设置为 NULL

PROCEDURE update_record (
    in_id       IN your_table.id%TYPE,
    in_name     IN your_table.name%TYPE DEFAULT NULL,
    in_address  IN your_table.address%TYPE DEFAULT NULL,
    in_phone    IN your_table.phone%TYPE DEFAULT NULL,
    in_...
) AS
BEGIN
  UPDATE your_table
  SET name = NVL( in_name, name ),
      address = NVL( in_address, address),
      phone = NVL( in_phone, phone ),
      ...
   WHERE id = in_id;
END update_record;

然后您可以使用命名参数调用它:

update_record( in_id => 123, in_address => 'New address' );

这允许您在必要时一次更新多个列。

关于sql - 我应该为我单独更新的每个数据库 table.column 编写一个完整的过程吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2382465/

相关文章:

javascript - 如何在多次ajax调用后在不同的模态窗口中显示图表?

mysql - 在此查询中,如何在 GROUP BY 之前执行 SELECT?

oracle - 在 Oracle DB 中将 float 转换为 DateTime

javascript - jQuery Ajax 在每次 TD 点击时显示值(value)

javascript - Laravel Ajax POST 请求不起作用 : 302 found

android - 如何从 Android 中现有的 SQLiteBatabase 中读取特定列?

mysql - SQL - 没有主键的串联

sql - Oracle 窗口函数求和

sql - Google BigQuery WHERE NOT 列表包含字符串的意外行为

java - 将具有相同名称的行放在一起