Oracle, вопрос по dynamic SQL: апдейт поля своего типа
От: Astellar  
Дата: 27.09.07 08:52
Оценка:
Уважаемые коллеги, помогите с такой проблемкой...
Есть некие типы:

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;


Заранее спасибо!
Я весьма доверчив, когда речь идет о моих словах. Я верю всему, что
говорю, хотя и знаю, что я лжец.
Re: Oracle, вопрос по dynamic SQL: апдейт поля своего типа
От: wildwind Россия  
Дата: 27.09.07 10:53
Оценка:
Здравствуйте, Astellar, Вы писали:

Читай про Native Dynamic SQL.
Re[2]: Oracle, вопрос по dynamic SQL: апдейт поля своего т
От: Astellar  
Дата: 28.09.07 01:22
Оценка:
Здравствуйте, wildwind, Вы писали:

W>Здравствуйте, Astellar, Вы писали:


W>Читай про Native Dynamic SQL.


Проблема решилась

s := 'UPDATE '||p_table||' SET params = :p WHERE '||p_table||'_id = '||id;
EXECUTE IMMEDIATE s USING ps;

Спасибо
Я весьма доверчив, когда речь идет о моих словах. Я верю всему, что
говорю, хотя и знаю, что я лжец.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.