Я пытаюсь создать процедуру, которая обновляет таблицу, которая зависит от того, какие параметры используются.Обновить только Выбранные столбцы из параметров
Пример таблицы и данные ниже:
create table test_upd_tab
(
co1 varchar2(100)
, co2 varchar2(100)
, co3 varchar2(100)
, co4 varchar2(100)
, co5 varchar2(100)
, dat1 varchar2(100)
, dat2 varchar2(100)
);
insert into test_upd_tab (co1, co2, co3, co4, co5, dat1, dat2) values ('co1', 'co7', 'co13', 'co19', 'co25', 'dat31', 'dat37');
insert into test_upd_tab (co1, co2, co3, co4, co5, dat1, dat2) values ('co2', 'co8', 'co14', 'co20', 'co26', 'dat32', 'dat38');
insert into test_upd_tab (co1, co2, co3, co4, co5, dat1, dat2) values ('co3', 'co9', 'co15', 'co21', 'co27', 'dat33', 'dat39');
insert into test_upd_tab (co1, co2, co3, co4, co5, dat1, dat2) values ('co4', 'co10', 'co16', 'co22', 'co28', 'dat34', 'dat40');
insert into test_upd_tab (co1, co2, co3, co4, co5, dat1, dat2) values ('co5', 'co11', 'co17', 'co23', 'co29', 'dat35', 'dat41');
insert into test_upd_tab (co1, co2, co3, co4, co5, dat1, dat2) values ('co6', 'co12', 'co18', 'co24', 'co30', 'dat36', 'dat42');
commit;
Эта таблица будет обновляться с использованием пакета ниже:
create or replace package xxtest_upd_pkg
as
procedure update_tab (p_co1 test_upd_tab.co1%type
, p_co2 test_upd_tab.co2%type
, p_co3 test_upd_tab.co3%type
, p_co4 test_upd_tab.co4%type
, p_co5 test_upd_tab.co5%type
, p_dat1 test_upd_tab.dat1%type
, p_dat2 test_upd_tab.dat2%type
);
end xxtest_upd_pkg;
create or replace package body xxtest_upd_pkg
as
procedure update_tab (p_co1 test_upd_tab.co1%type
, p_co2 test_upd_tab.co2%type
, p_co3 test_upd_tab.co3%type
, p_co4 test_upd_tab.co4%type
, p_co5 test_upd_tab.co5%type
, p_dat1 test_upd_tab.dat1%type
, p_dat2 test_upd_tab.dat2%type
)
as
begin
UPDATE test_upd_tab
SET co1 = p_co1
, co2 = p_co2
, co3 = p_co3
, co4 = p_co4
, co5 = p_co5
where dat1 = p_dat1
and dat2 = p_dat2;
end update_tab;
end xxtest_upd_pkg;
Однако, иногда, только некоторые столбцы должны обновляться, и не все на в то же время. Что-то, как показано ниже:
begin
-- only update co1 to co3 then don't touch co4 and co5
xxtest_upd_pkg.update_tab (p_co1 => 'x'
, p_co2 => 'y'
, p_co3 => 'z'
, p_dat1 => 'dat31'
, p_dat2 => 'dat37');
-- only update co3 to co5 hen don't touch co1 and co2
xxtest_upd_pkg.update_tab (p_co3 => 'zz'
, p_co4 => 'a'
, p_co5 => 'b'
, p_dat1 => 'dat33'
, p_dat2 => 'dat39');
-- update co3 to null
xxtest_upd_pkg.update_tab (p_co3 => null
, p_dat1 => 'dat35'
, p_dat2 => 'dat41');
end;
, конечно, это приводит к ошибке ниже:
PLS-00306: wrong number or types of arguments in call to 'UPDATE_TAB'
P.S. Я не могу использовать что-то вроде «NVL (p_co1, co1)», как показано ниже, потому что есть некоторые экземпляры, которые действительно будут передавать нулевые значения.
create or replace package body xxtest_upd_pkg
update_tab (p_co1 test_upd_tab.co1%type default null
, p_co2 test_upd_tab.co2%type default null
, p_co3 test_upd_tab.co3%type default null
, p_co4 test_upd_tab.co4%type default null
, p_co5 test_upd_tab.co5%type default null
, p_dat1 test_upd_tab.dat1%type
, p_dat2 test_upd_tab.dat2%type
)
as
begin
UPDATE test_upd_tab
SET co1 = nvl(p_col1, co1)
, co2 = nvl(p_col2, co2)
, co3 = nvl(p_col3, co3)
, co4 = nvl(p_col4, co4)
, co5 = nvl(p_col5, co5)
where dat1 = p_dat1
and dat2 = p_dat2;
end update_tab;
end xxtest_upd_pkg;
Как это сделать без использования перегруженных функций или динамического SQL?
спасибо!
привет @ Джастином пещере да Я тоже это пробовал. Я использовал -1 и «N/A» в качестве значений по умолчанию для Numerical и Varchar2 Columns. Я проверю это немного больше. –