Уважаемые коллеги, помогите с такой проблемкой...
Есть некие типы:
CREATE OR REPLACE TYPE t_param AS OBJECT
(
p_name VARCHAR2(20),
n_value NUMBER,
);
CREATE OR REPLACE TYPE t_params AS VARRAY(100) OF t_param;
Есть таблица (одна из многих)
CREATE TABLE test
(
test_id NUMBER(4),
params t_params,
alg t_algs
);
Есть процедура set_parametr, которая что-то делает с полем params, и эти изменения нужно записать в таблицу
Проблема в том, что имя таблицы передается в процедуру качестве строки, и, соответственно, надо использовать
динамический SQL.
В коде процедуры, приведенном ниже, используется и отлично работает статический update, с жестко забитым именем таблицы.
Вместо него надо как-то запустить апдейт для таблицы, имя которой передается в качестве параметра.
(прим.: имена поля params и первичного ключа одинаковы для всех таблиц, это типа договоренность)
PROCEDURE set_parametr(p_name VARCHAR2,
p_type_id NUMBER,
p_value NUMBER,
p_table VARCHAR2,
id NUMBER)
AS
ps t_params;
p t_param;
s VARCHAR2(500);
rc SYS_REFCURSOR;
flag BOOLEAN := FALSE;
BEGIN
s := 'SELECT params FROM '||p_table||' WHERE '||p_table||'_id = '||id;
OPEN rc FOR s;
FETCH rc INTO ps;
CLOSE rc;
IF ps IS NOT NULL
THEN
FOR i IN ps.first..ps.last
LOOP
p := ps(i);
IF UPPER(p.p_name) = UPPER(set_parametr.p_name)
THEN
-- do something
EXIT;
END IF;
END LOOP;
ELSE
ps := t_params();
END IF;
IF flag = false
THEN
p := t_param(NULL,NULL,NULL,NULL,NULL,NULL,NULL);
-- do something
ps.extend(1);
ps(ps.last) := p;
END IF;
-- ВОТ ЗДЕСЬ ПРОБЛЕМА: НАДО ДИНАМИЧЕСКИ ПОДСТАВЛЯТЬ ИМЯ ТАБЛИЦЫ
update test t
set t.params = ps
where t.test_id = id;
END;
Заранее спасибо!
Я весьма доверчив, когда речь идет о моих словах. Я верю всему, что
говорю, хотя и знаю, что я лжец.