вставка загруженных значений файла в глобальную таблицу - PullRequest
2 голосов
/ 06 апреля 2020

клиент загружает текстовый файл - содержит alphanumeri c ID в каждой строке текстового файла (один столбец). Что я делаю, так это то, что в своем классе контроллеров я читаю каждую строку из текстового файла и разделяю их на запятые (100X, 101Y, 102Z, 103T, 104G, 105V, 106 C, 107W, 108Q).

Я посылаю значения, разделенные запятыми, как одну строку, в процедуру oracle, где мне нужно вставить эти значения в глобальную таблицу (каждое значение в отдельной строке). Я новичок в хранимой процедуре, поэтому я понятия не имею, как я должен вставить эти значения в глобальную таблицу. Или я могу выполнить свои требования с помощью загрузчика sql, как мы используем загрузчик sql? Можете ли вы, ребята, помогите / направьте меня по моей проблеме Пожалуйста, проверьте код ниже для получения дополнительной информации.

//just for a test

create global temporary table my_temp_table( //global  table
   id varchar2(30);
) 
on commit preserve rows;    

//this is my procedure
CREATE OR REPLACE PROCEDURE remove_emp (
employee_id IN CLOB //CONTAINS COMMA  SEPERATED ALPHANUMERIC VALUES ('100X,101Y,102Z,103T'..)
) AS
BEGIN
  INSERT INTO my_temp_table(id) VALUES( //not working for me, need help here
  employee_id)

enter image description here

1 Ответ

2 голосов
/ 06 апреля 2020

Посмотрите, поможет ли это.

Процедура разбивает разделенные запятыми значения на строки и вставляет их в таблицу.

SQL> create or replace procedure remove_emp (par_empid in clob) is
  2  begin
  3    insert into my_temp_table (id)
  4    select regexp_substr(par_empid, '[^,]+', 1, level)
  5    from dual
  6    connect by level <= regexp_count(par_empid, ',') + 1;
  7  end;
  8  /

Procedure created.

Тестирование:

SQL> begin
  2    remove_emp('100X,101Y,102Z,103T,104G,105V,106C,107W,108Q');
  3  end;
  4  /

PL/SQL procedure successfully completed.

SQL> select * From my_temp_table;

ID
------------------------------
100X
101Y
102Z
103T
104G
105V
106C
107W
108Q

9 rows selected.

SQL>

Однако на вашем месте я бы полностью пропустил это. Поскольку у вас уже есть файл, содержащий строки данных, используйте

  • SQL* Loader или
  • функцию внешних таблиц или
  • пакет UTL_FILE

до загрузить такие данные. Потому что сейчас вы должны

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

Много работы, большая часть которой зря.

Что касается предложенных мною "новых" вариантов, SQL* Загрузчик позволяет вам иметь исходный файл локально (на вашем P C), в то время как другие две опции требуют, чтобы файл находился на сервере базы данных. Какой бы вариант вы ни выбрали, он будет быстрее, чем вы делаете сейчас. Подумайте об этом.


SQL* Загрузчик пример:

Управляющий файл прост; Предполагается, что файл находится в моем каталоге c:\temp и его имя data16.txt.

load data
infile 'c:\temp\data16.txt'
replace
into table my_temp_table
(
  id char(30)
)  

Описание таблицы:

SQL> desc my_temp_table;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                                 VARCHAR2(30)

Сеанс загрузки:

c:\Temp>sqlldr scott/tiger control=test16.ctl log=test16.log

SQL*Loader: Release 11.2.0.2.0 - Production on Pon Tra 6 12:44:34 2020

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

Commit point reached - logical record count 8
Commit point reached - logical record count 9

Результат:

c:\Temp>sqlplus scott/tiger

SQL*Plus: Release 11.2.0.2.0 Production on Pon Tra 6 12:44:42 2020

Copyright (c) 1982, 2014, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production

SQL> select * From my_temp_table;

ID
------------------------------
100X
101Y
102Z
103T
104G
105V
106C
107W
108Q

9 rows selected.

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