Генерация сценариев Oracle PL / SQL из таблицы Excel - PullRequest
1 голос
/ 13 июля 2010

У меня есть требование для создания файла сценария вставки из листа Excel. Я частично успешно в создании файла сценария. Но я попал в ситуацию, мне нужна помощь от любого1.

Моя логика выглядит примерно так: прочитайте первую ячейку, проверьте, существует ли значение в ячейке в БД. Если нет, сгенерируйте скрипт вставки следующим образом

declare 
    PK1 integer;
begin
    select tablename_seq.currval into PK1 from dual;
    insert into TableName valuestablename_seq_seq.nextval,'Blagh',1);
end;

Я храню PK1 в хеш-таблице с данными, имеющей KEY. Поэтому, если те же данные появятся в следующих строках, используя поиск по хеш-таблице, я получу значение хеш-таблицы для соответствующего ключа данных и передам его параметр в другой скрипт вставки. Но каждый раз, когда я генерирую новую переменную, такую ​​как PK1, Pk2 ... и т. Д., Я сохраняю ключевое слово «BEGIN» после объявления, а также добавляю ключевое слово «END» после каждой вставки, если я делаю это, область видимости переменной выходит за рамки. Я могу использовать эти объявленные переменные в другой инструкции вставки имеет параметр. Есть ли шанс сохранить PK1, Pk2 ..... имеет сеансовые / глобальные переменные для выполнения скрипта. Таким образом, они станут доступны в течение всего времени выполнения скрипта.

Ответы [ 5 ]

2 голосов
/ 13 июля 2010

Я склонен сказать, что каждая строка вашей электронной таблицы должна просто создавать оператор, такой как insert into TableName values (tablename_seq_seq.nextval,'Blagh',1) returning ID into PK1;, а затем обернуть все это в один блок DECLARE-BEGIN-END с определенными соответствующими переменными, что-то вроде:

declare
   pk1 integer;
   pk2 integer;
begin
   insert into TableName 
       values (tablename_seq_seq.nextval,'Blagh',1) 
       returning ID into PK1;
   insert into TableName  
       values (tablename_seq_seq.nextval,'Urgh',2)  
       returning ID into PK2;
   [...]
end;

Вы можете даже создать список объявлений переменных в одном столбце, а SQL - в другом, а затем скопировать и вставить их в нужное место в блоке.

1 голос
/ 14 июля 2010

Я бы начал с

DECLARE
  PROCEDURE action (p_val IN INTEGER) IS
  ...
  END action;
BEGIN

Затем пусть каждая строка в электронной таблице просто вызовет процедуру, чтобы запись в таблице в 1 стала

  action (1);

Тогда вы получите что-то вроде

DECLARE
  PROCEDURE action (p_val IN INTEGER) IS
  ...
  END action;
BEGIN
  action (1);
  action (8);
  action (23);
  action (1);
  action (1);
END;

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

0 голосов
/ 14 июля 2010

Если вы используете Oracle E-Business, вас может заинтересовать webadi.

Этот инструмент создает файлы Excel для заполнения и последующей загрузки в базу данных с помощью процедуры. Затем вы можете проверить свои данные.

Создание пользовательских интеграторов веб-ADI
WebADI - Использование собственного интегратора

0 голосов
/ 14 июля 2010

Вместо каждой строки рассмотрим каждую клетку. Каждая ячейка будет генерировать скрипт вставки в соответствующую ячейку. Я создал таким же образом, проблема в том, что если я хочу использовать переменную PK1, где-то в строке 10, столбец 10 (значение ячейки) вставить скрипт, потому что мы заканчиваем 'end' сразу после блока Begin, область действия PK1 всегда оставаться в блоке Begin. Для этого я создал Begin с одной вставкой, а затем создал другой Begin с другой вставкой и т. д. and the end, добавляя end; end; Но проблема с вышеуказанным методом заключается в том, что я пытаюсь вставить 200 строк X 200 столбцов = 400 ячеек вставить сценарии. в этом потоке, когда я пытаюсь запустить скрипт, он выдает ошибку времени выполнения «Переполнение стека»

0 голосов
/ 13 июля 2010

Является ли вопрос о наилучшем способе обновления базы данных из электронной таблицы или о лучшем способе создания сценария из электронной таблицы?

Я бы порекомендовал загрузить данные электронной таблицы во временную таблицу и затем использовать простой оператор INSERT / SELECT, если вы не беспокоитесь о конфликтах уникальности, и в этом случае я бы вместо этого использовал оператор MERGE. Это намного проще, чем пытаться сгенерировать скрипт с логикой для каждого оператора вставки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...