Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Oracle获取游标的所有列以在插入到中时使用_Sql_Oracle_Plsql - Fatal编程技术网

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!=专栏(我不想要)