我正在尝试获取一个允许我从列中获取数据并将其插入另一个表中的两个不同列的过程。第一个表目前在一列中包含名字和姓氏。我有另一个在不同列中具有名字和姓氏的表,我需要将它们从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;
任何想法/帮助?谢谢你们。
答案 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)
PL / SQL存储过程是完成任务的好方法。将单个名称字段细分为FIRST NAME
和LAST 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.