разделить строку, а затем вставить записи в таблицу - PullRequest
0 голосов
/ 25 октября 2019

У меня есть таблица emp с полями id, name, salary, dept. Я хочу создать процедуру для вставки записей в эту таблицу emp.

В этой процедуре только одна строка является параметром.

string = 1 $ shubham $ 1000 $ comp # 2 $ vijay $ 5000 $civil # 33 $ ram $ 23456 $ mech # ......

затем в таблицу emp вставьте записи типа id |имя |зарплата |dept 1 shubham 1000 comp 2 vijay 5000 civil 33 ram 23456 mech

Строка разделена '#', любое значение столбца разделено '$', и если данные записи уже присутствуют, обновите эти записи на основе empID, т. Е. Emp ID - это первичный ключ в этой таблице.

Приведенная ниже процедура не показала мне правильный вывод.

create or replace procedure proc_one_stack_DUP ( string_in in varchar2 )


IS 

limit_a varchar2(1000);
v_id number(10);
v_name varchar2(1000);
v_salary varchar2(1000);
v_dept varchar2(1000);

v_one  varchar2(100);

pos_id number(10);
pos_name number(10);
pos_salary number(10);
pos_dept number(10);

counter number(10);
string_1 varchar2(1000);
len_all number(10);
len_copy  number(10);
a1 number(10);
begin 


len_copy:=0;
pos_id := 1;
counter := 0;

len_all:=length(string_in);



limit_a := REGEXP_COUNT (string_in, '#');

for i in 1..limit_a
loop 


string_1 := substr(string_in,counter+1,INSTR (string_in,'#')-1);
 a1 := length(string_1);

--for k in 1..1
--loop

v_id := substr(string_1,pos_id,INSTR (string_1,'$')-1);
pos_id := length(v_id);

v_name := substr(string_1,pos_id+2,INSTR (string_1,'$',1,2)-pos_id-1-1);
pos_name := length(v_name);

v_salary := substr(string_1,pos_name+pos_id+3,INSTR (string_1,'$',1,3)-pos_name-pos_id-1-2);
pos_salary := length(v_salary);

v_dept := substr(string_1,pos_salary+pos_id+pos_name+4,INSTR (string_1,'#')-pos_name-pos_id-pos_salary-1-3); -- INSTR (string_1,'#')-1
pos_dept := length(v_dept);

insert into emp values (v_id,v_name,v_salary,v_dept);
commit;

--end loop;  

counter := counter+a1+1;

end loop;

end;

1 Ответ

0 голосов
/ 25 октября 2019

Вы можете просто использовать один оператор выбора, где ваша строка должна быть разбита на нужные столбцы следующим образом:

SQL> DROP TABLE EMP;

Table dropped.

SQL>
SQL> CREATE TABLE EMP (
  2      ID       NUMBER,
  3      NAME     VARCHAR2(10),
  4      SALARY   NUMBER,
  5      DEPT     VARCHAR2(10)
  6  );

Table created.

SQL>
SQL> DEFINE P_INPUT_STRING = '1$shubham$1000$comp#2$vijay$5000$civil#33$ram$23456$mech#';
SQL>
SQL> INSERT INTO EMP
  2      SELECT
  3          REGEXP_SUBSTR(INP, '[^$]+', 1, 1) AS ID,
  4          REGEXP_SUBSTR(INP, '[^$]+', 1, 2) AS NAME,
  5          REGEXP_SUBSTR(INP, '[^$]+', 1, 3) AS SALARY,
  6          REGEXP_SUBSTR(INP, '[^$]+', 1, 4) AS DEPT
  7      FROM
  8          (
  9              SELECT
 10                  REGEXP_SUBSTR(TRIM('#' FROM '&p_input_string'), '[^#]+', 1, LEVEL) AS INP
 11              FROM
 12                  DUAL
 13              CONNECT BY
 14                  LEVEL <= REGEXP_COUNT(TRIM('#' FROM '&p_input_string'), '#')
 15          );

2 rows created.

SQL>
SQL> SELECT * FROM EMP;

        ID NAME           SALARY DEPT
---------- ---------- ---------- ----------
         1 shubham          1000 comp
         2 vijay            5000 civil

SQL>

Cheers !!

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