我有一个大量使用 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/