Должен ли я написать целую процедуру для каждой таблицы table.column, которую я обновляю отдельно? - PullRequest
3 голосов
/ 04 марта 2010

У меня есть приложение, которое свободно использует AJAX. У меня есть несколько мест, где обновляется один столбец базы данных для записи, которую пользователь активно редактирует.

До сих пор я создавал отдельные хранимые процедуры для каждого действия AJAX ... поэтому у меня есть хранимые процедуры UPDATE_NAME, UPDATE_ADDRESS, UPDATE_PHONE.

Мне просто интересно, есть ли лучший способ продолжить использование хранимых процедур, но без создания одного для каждого столбца.

Я бы хотел избежать размышлений над строковым параметром, который указывает столбец, если это возможно. То есть Я знаю, что у меня может быть процедура UPDATE_COLUMN, которая принимает в качестве одного из параметров имя столбца. Этот вид дает мне волю, но если это единственный способ сделать это, то я могу еще немного подумать. Но не все столбцы имеют одинаковый тип данных, так что это не похоже на серебряную пулю.

Ответы [ 4 ]

3 голосов
/ 04 марта 2010

Рассмотрите возможность написания одной процедуры обновления, которая принимает несколько столбцов и использует 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' );

Это позволяет обновлять несколько столбцов одновременно, когда это необходимо.

1 голос
/ 04 марта 2010

Я бы сказал, чтобы прекратить использовать хранимые процедуры для таких простых действий, нет никакого оправдания для создания такого количества маленьких процедур для каждого столбца в базе данных. Для этого вам гораздо лучше использовать динамический sql (с параметрами).

0 голосов
/ 04 марта 2010

Не мешает делать то, что ты делаешь, но это может стать немного сумасшедшим, если ты продолжишь этот путь.Одна вещь, которую вы можете сделать, это создать одну хранимую процедуру и назначить значения NULL в качестве параметров по умолчанию для всех ваших полей, которые вы обновляете.Поэтому, когда вы вызываете sproc из своего приложения, если параметру присваивается значение, это значение будет использоваться в обновлении, в противном случае параметр будет иметь нулевое значение.

Затем вы можете выполнить проверку в sproc IF @Parameter IS NOT NULL ...

Если вам когда-нибудь понадобится обновить только одно поле, и вы не хотите создавать один центральный sproc и передавать нули,затем используйте решение Octavia прямо под моим и напишите простую процедуру обновления.

0 голосов
/ 04 марта 2010

Создайте процедуру, которая может обновлять каждый столбец, но обновляет только столбцы, для которых вы передаете ненулевой параметр

CREATE PROCEDURE spUpdateFoo (@fooId INT, @colA INT, @colB VARCHAR(32), @colC float)
AS

update Foo set colA = ISNULL(@colA, colA), 
    colB = ISNULL(@colB, colB), 
    colC = ISNULL(@colC, colC)
where fooId = @fooId

Обратите внимание, что это не работает, если вы хотите иметь возможность явно устанавливать нулевые значения в вашей процедуре, но вы можете выбрать другое значение, чтобы указать неизменность (-1 и т. Д.) С немного большей сложностью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...