【问题标题】: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;

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

【问题讨论】:

    标签: sql oracle plsql


    【解决方案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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-05
      • 1970-01-01
      • 1970-01-01
      • 2014-11-21
      • 2014-08-10
      • 2012-02-10
      相关资源
      最近更新 更多