将数据从一列插入另一个表中的两列的过程

时间:2014-04-19 05:31:05

标签: sql oracle plsql

我正在尝试获取一个允许我从列中获取数据并将其插入另一个表中的两个不同列的过程。第一个表目前在一列中包含名字和姓氏。我有另一个在不同列中具有名字和姓氏的表,我需要将它们从Column1 / Table1中分离并插入到Table2中的两列中,最好使用一个过程,因为我有很多要迁移的名称。

表1中的Column1(Name)看起来像这样

     NAME          
First_Name1 Last_name1 

First_Name2 Last_Name2 

First_Name3 Last_Name3       

我需要使用第一个表中的数据将表2中的数据分离为FName / LName:

F_Name     |  L_Name

First_Name1|Last_Name1

First_Name2|Last_Name2

First_Name3|Last_Name3

我想出了如何使用SUBSTR和INSTR从最后和第一个名称中分离数据,但我无法弄清楚如何将它放在一个过程中,或者如何循环它,因为我想使用它几行。

select substr(staff.name, 0, instr(staff.name, ' ')-1) as Fname
from staff;
select substr(staff.name, instr(staff.name,' ')+1) as Lname
from Staff;

任何想法/帮助?谢谢你们。

2 个答案:

答案 0 :(得分:0)

这应该适合你。

insert into newtable(FirstName, LastName)
  select substr(staff.name, 0, instr(staff.name, ' ') - 1),
         substr(staff.name, instr(staff.name, ' ') + 1)
    from staff;

答案 1 :(得分:0)

为多个DML目标构建循环的基于PL / SQL的DML游标

PL / SQL存储过程是完成任务的好方法。将单个名称字段细分为FIRST NAMELAST NAME组件的另一种方法可能是使用Oracle Regular Expression,如:

SELECT REGEXP_SUBSTR('MYFIRST MYLAST','[^ ]+', 1, 1) from dual
-- Result: MYFIRST

SELECT REGEXP_SUBSTR('MYFIRST MYLAST','[^ ]+', 1, 2) from dual
-- Result: MYLAST

基于程序的方法是个好主意;首先将此查询包装到游标定义中。将游标集成到一个完整的PL / SQL存储过程DDL脚本中。

CREATE or REPLACE PROCEDURE PROC_MYNAME_IMPORT IS

    -- Queries parsed name values from STAFF (the source) table 

    CURSOR name_cursor IS
       SELECT REGEXP_SUBSTR(staff.name,...) as FirstName,
              REGEXP_SUBSTR(... ) as LastName
         FROM STAFF;

    BEGIN

       FOR i IN name_cursor LOOP

          --DML Command 1:
          INSERT INTO Table_One ( first_name, last_name )
          VALUES (i.FirstName, i.LastName);
          COMMIT;

          --DML Command 2:
          INSERT INTO Table_Two ...
          COMMIT;

          END LOOP;

    END proc_myname_import;

从示例块中可以看出,对于给定的游标记录及其值,每个循环迭代处理时,可以发生一系列DML语句(不仅仅是两个)。每个字段都可以由游标SQL语句中分配给它们的名称引用。有一个'。' (点)表示分配给游标调用的句柄是前缀的表示法,如:

CURSOR c1 IS
   SELECT st.col1, st.col2, st.col3
     FROM sample_table st
    WHERE ...

然后光标调用循环遍历主记录集:

FOR my_personal_loop IN c1 LOOP
    ...do this
    ...do that

    INSERT INTO some_other_table (column_one, column_two, column_three)
    VALUES (my_personal_loop.col1, my_personal_loop.col2, ...);

    COMMIT;
END LOOP;

... and so on.