Автоматизация процедур Oracle Store - PullRequest
1 голос
/ 03 декабря 2010

В настоящее время я работаю над процессом автоматизации создания процедур и функций магазина в oracle DB. Я использую Java для автоматизации процесса создания процедур магазина, так что, когда я даю имя таблицы, код Java будет производить процедуры для:

  • выберите
  • вставка
  • обновление
  • удалить

и поместите их в текстовые файлы

например

select * from emp where emp_id=i_emp_id and emp_nm=i_emp_nm and emp_dpt=i_emp_dpt

если все три входа не равны нулю, он должен работать как

select * from emp where emp_id=i_emp_id and emp_nm=i_emp_nm and emp_dpt=i_emp_dpt

если я передаю i_emp_id как ноль, тогда запрос должен работать как

select * from emp where emp_nm=i_emp_nm and emp_dpt=i_emp_dpt

если я передаю i_emp_id как ноль, а i_emp_dpt как ноль, тогда запрос должен работать как

select * from emp where emp_nm=i_emp_nm

аналогично для обновления и т.д.

У меня уже был опубликован вопрос по этому вопросу

Не могли бы вы дать мне несколько обобщенных запросов для Выбрать вставить Обновить и удалите

мои входные данные для процедур хранения могут отличаться от нуля или фактических значений

Ответы [ 3 ]

3 голосов
/ 03 декабря 2010

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

В любом случае, это огромная часть работы, которую вы кусаете. Это требует большого понимания Oracle, SQL и PL / SQL, чтобы понять это правильно. И неполное решение будет бесполезным. Возможно, даже хуже, чем бесполезно.

Так что, не пиши это сам. Ведущий эксперт по PL / SQL Стивен Фюрштайн написал сложную утилиту для генерации API таблиц: Quest Code Generation Utility (ранее QNXO). Это бесплатно с сайта квестов. Найдите это здесь . Правда это не написано на Java, ну и что?

0 голосов
/ 03 декабря 2010

Есть много способов решить эту проблему.

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

Другое решение - использовать фиксированный набор параметров, а не фильтровать пустые значения ....

select * 
from emp 
where emp_id=NVL(i_emp_id, emp_id) 
and emp_nm=NVL(i_emp_nm, emp_nm) 
and emp_dpt=NVL(i_emp_dpt, emp_dpt);

Или вы можете создать запрос в виде строки в PL / SQL и использовать «EXECUTE IMMEDIATE» ....

PROCEDURE finder (
      i_emp_id IN emp.emp_id%TYPE,
      i_emp_nm IN emp.emp_nm%TYPE DEFAULT NULL,
      i_emp_dpt IN emp.emp_dpt%TYPE DEFAULT NULL,
      .... 
   )
IS
   l_qry VARCHAR2(1000) := 'SELECT * FROM emp WHERE 1=1';
BEGIN
   IF (i_emp_nm IS NOT NULL ) 
   THEN
      l_qry := l_qry || ' AND emp_nm=' || i_emp_nm;
   IF (i_emp_dpt IS NOT NULL )
   THEN
      l_qry := l_qry || ' AND emp_dpt=' || i_emp_dpt;
   EXECUTE IMMEDIATE l_qry;
....
0 голосов
/ 03 декабря 2010

Я не уверен, что то, что вы хотите, окажется полезным, но если вы хотите сгенерировать операторы вставки, обновления или удаления, полезно знать о представлениях all_tab_columns и user_tab_columns.

Пример вставки:

select 'insert into ' || :table_name || ' (' qry
from   dual
union all
select column_name || ', '
from   user_tab_columns
where  table_name = :table_name
union all
select ') values ('
from   dual
union all
select ':' || column_name || ', '
from   user_tab_columns
where  table_name = :table_name
union all
select ')'
from   dual
...