SQL Oracle获取游标的所有列以在插入到中时使用
我想创建一个过程,在这个过程中,我使用光标选择某些行,然后将它们插入另一个表中。我想知道是否有一种符号可以写得更快。 例如,下面是完整的过程SQL Oracle获取游标的所有列以在插入到中时使用,sql,oracle,plsql,Sql,Oracle,Plsql,我想创建一个过程,在这个过程中,我使用光标选择某些行,然后将它们插入另一个表中。我想知道是否有一种符号可以写得更快。 例如,下面是完整的过程 create or replace procedure myProc as Cursor lines is select * from table1 where c = '2'; begin for line in lines loop insert into table2 values(line.a, lin
create or replace procedure myProc as
Cursor lines is
select * from table1 where c = '2';
begin
for line in lines loop
insert into table2 values(line.a, line.b, line.c, line.d ....);
end loop;
end;
/
我想知道是否可以将“插入”行替换为
insert into table2 values(line.something);
或
(我认为视图可能更有效,但这不是这里的问题。)绝对:
create or replace procedure myProc as
begin
insert into table2( . . .)
select a, b, c, d, . .
from table1
where c = '2';
end;
/
您还应该在表2中列出列。这就是表2(…)
的意思。绝对:
create or replace procedure myProc as
begin
insert into table2( . . .)
select a, b, c, d, . .
from table1
where c = '2';
end;
/
您还应该在表2中列出列。这就是表2(…)
的意思。尽管在两个表的结构相同的情况下,应使用以下代码
INSERT INTO target_table
SELECT * FROM source_table;
。。。您应该避免这种编程方式,因为添加到源表或目标表中的任何列都将以SQL结尾,这将是无效的。尽管以下代码在两个表的结构相同的情况下应该可以工作
INSERT INTO target_table
SELECT * FROM source_table;
。。。您应该避免这种编程方式,因为添加到源表或目标表中的任何列都将以SQL结尾,因为SQL变得无效。看起来您在寻找捷径,以避免在insert
语句中限定列名
嗯,虽然我不推荐这样做,但它是可以做到的,因为它有点乏味。以下是一个例子:
如果您有一个表employee(员工id、员工姓名、职务)
。您需要在数据库中创建两种类型-
a。类似于employee
-
create type employee_obj as object (employee_id number(28,0),
employee_name varchar2(100),
designation varchar2(30));
b。创建此记录的集合类型-
create type employee_obj_set is table of employee_obj;
c。在PL/SQL过程中,可以使用以下内容:
DECLARE
empset employee_obj_set;
-- More variables here
BEGIN
-- other operations
-- populate your empset
-- other operations
INSERT INTO employee
SELECT * FROM table(empset);
-- other operations
END;
/
看起来您正在寻找捷径,以避免在insert
语句中限定列名
嗯,虽然我不推荐这样做,但它是可以做到的,因为它有点乏味。以下是一个例子:
如果您有一个表employee(员工id、员工姓名、职务)
。您需要在数据库中创建两种类型-
a。类似于employee
-
create type employee_obj as object (employee_id number(28,0),
employee_name varchar2(100),
designation varchar2(30));
b。创建此记录的集合类型-
create type employee_obj_set is table of employee_obj;
c。在PL/SQL过程中,可以使用以下内容:
DECLARE
empset employee_obj_set;
-- More variables here
BEGIN
-- other operations
-- populate your empset
-- other operations
INSERT INTO employee
SELECT * FROM table(empset);
-- other operations
END;
/
要更快地插入,请使用批量收集/全部插入,而不是单一插入。请查找以下示例
DECLARE
CURSOR lines is select * from table1 where c = '2';
type lines_ty is table of table2%rowtype;
l_lines_t2 lines_ty;
BEGIN
OPEN lines;
LOOP
FETCH lines BULK COLLECT INTO l_lines_t2 LIMIT 500;
FORALL i IN 1..l_lines_t2.COUNT
INSERT INTO table2 VALUES l_lines_t2(i);
EXIT WHEN lines%NOTFOUND;
END LOOP;
CLOSE lines;
END;
要更快地插入,请使用批量收集/全部插入,而不是单一插入。请查找以下示例
DECLARE
CURSOR lines is select * from table1 where c = '2';
type lines_ty is table of table2%rowtype;
l_lines_t2 lines_ty;
BEGIN
OPEN lines;
LOOP
FETCH lines BULK COLLECT INTO l_lines_t2 LIMIT 500;
FORALL i IN 1..l_lines_t2.COUNT
INSERT INTO table2 VALUES l_lines_t2(i);
EXIT WHEN lines%NOTFOUND;
END LOOP;
CLOSE lines;
END;
我不知道这样。。。所以光标没有任何变化?为什么我要在表2中列出这些列?@Ccile。你应该避免使用光标。时期有时它们是必要的。在这种情况下,使用它们。您应该列出列,以便确保将正确的值插入到正确的列中。为什么?好的,专栏。我不知道这条路。。。所以光标没有任何变化?为什么我要在表2中列出这些列?@Ccile。你应该避免使用光标。时期有时它们是必要的。在这种情况下,使用它们。您应该列出列,以便确保将正确的值插入到正确的列中。为什么?对列来说,Ok。使用*只是说我选择了很多列,我不想写line.name1、line.name2等。我知道我必须至少写一次(用光标写两次)我的问题是如何使用游标,只写一次名称。您可以使用动态游标,查询所有的_TAB_列,以便为插入和选择生成列列表。所有的_TAB_列都用于*?如果我想要除一列以外的所有列?只需添加“WHERE COLUMN\u NAME!=COLUMN\u I\u dont\u want”*,使用*只是说我选择了很多列,我不想写line.name1、line.name2等。我知道我必须至少写一次(用光标写两次)我的问题是如何使用游标并只写一次名称。您可以使用动态游标并查询所有_TAB_列,以便为INSERT和SELECT生成列列表。所有_TAB_列都用于*?如果我想要除一列以外的所有列,只需添加“WHERE column_NAME!=专栏(我不想要)