如果我是你的话,我就不会为动态陈述而烦恼了。相反,我会用
COALESCE()
(或者你可以用
NVL()
CREATE OR REPLACE PROCEDURE p_update_client(i_client_id IN NUMBER,
i_iin IN NUMBER DEFAULT NULL,
i_full_name IN VARCHAR DEFAULT NULL) AS
no_id_provided EXCEPTION;
all_null_values EXCEPTION;
BEGIN
IF i_client_id IS NULL
THEN
RAISE no_id_provided;
END IF;
IF i_iin IS NULL
AND i_full_name IS NULL
THEN
RAISE all_null_values;
END IF;
UPDATE t_client
SET iin = COALESCE(i_iin, iin),
full_name = COALESCE(i_full_name, full_name)
WHERE client_id = i_client_id;
EXCEPTION
WHEN no_id_provided THEN
raise_application_error(-20100, 'Client_id value must not be null.');
WHEN all_null_values THEN
raise_application_error(-20101, 'To update record, input parameters must not be null.');
WHEN OTHERS THEN
ROLLBACK;
END p_update_client;
/
AND (iin != COALESCE(i_iin, iin)
OR full_name != COALESCE(i_full_name, full_name))
这样,如果传入的值与列的当前值相同,则实际上不会发生更新(这将是浪费时间)。