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

Posted

技术标签:

【中文标题】将数据从一列插入另一个表的两列的过程【英文标题】:Procedure to insert data from one column into two columns in another table 【发布时间】:2014-04-19 05:31:05 【问题描述】:

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

表 1 中的 Column1(Name) 如下所示

     NAME          
First_Name1 Last_name1 

First_Name2 Last_Name2 

First_Name3 Last_Name3       

并且我需要使用第一个表中的数据将 Table2 中的数据像这样分隔为 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;

有什么想法/帮助吗?谢谢大家。

【问题讨论】:

【参考方案1】:

为多个 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.

【讨论】:

这解释了我正在尝试做的很多事情,您甚至深入了解了如何使用光标。非常感谢! 很高兴能帮上忙!光标是很好的通用结构。在我的示例中,我使用了不需要发出 FETCH 命令或一些循环检查机制来保持光标打开的符号样式。 (例如 %ISOPEN)【参考方案2】:

这应该适合你。

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

【讨论】:

以上是关于将数据从一列插入另一个表的两列的过程的主要内容,如果未能解决你的问题,请参考以下文章

如何在 OpenOffice 中将一列单元格从一张表插入到另一张表的单个单元格中?

连接来自两个不同表的两列

将数据库一个表的两列数据合并且去重

两个表,一个表中的两列关联另一个表的id,如何将这个表中的两列显示为另一个表id对应的内容

如何根据合并的数据框之一的两列的值在熊猫数据框中添加值

怎样在matlab中把矩阵的两列合并成一列,只是把两列的数据放在一起