【问题标题】:SQL Oracle get the all columns of a cursor to use in a insert intoSQL Oracle 获取游标的所有列以在插入时使用
【发布时间】:2017-06-10 16:31:02
【问题描述】:

我想创建一个过程,在该过程中我使用光标选择某些行,然后将它们插入到另一个表中。我想知道是否有一种符号可以更快地编写它。 例如这里是完整的过程

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);

insert into tables2 values(something(line));

(我认为视图可能更有效,但这不是这里的问题。)

【问题讨论】:

    标签: sql oracle plsql


    【解决方案1】:

    绝对:

    create or replace procedure myProc as
    begin
      insert into table2( . . .)
        select a, b, c, d, . . 
        from table1
        where c = '2';
    end;
    /
    

    您还应该列出table2 中的列。这就是table2( . . . ) 的意思。

    【讨论】:

    • 我不知道这种方式......所以光标什么都没有?为什么要列出table2 中的列?
    • @Ccile 。 . .您应该避免使用游标。时期。有时它们是必要的。在这种情况下,请使用它们。您应该列出列,以便确保将正确的值插入到正确的列中。
    • 为什么?好的列。
    【解决方案2】:

    尽管下面的代码应该在两个表的结构相同的情况下工作......

    INSERT INTO target_table
      SELECT * FROM source_table;
    

    ...您应该避免这种编程方式,因为添加到源表或目标表的任何列都将以 SQL 结尾。

    【讨论】:

    • 使用*只是说我选择了很多列,我不想写line.name1,line.name2等。我知道我至少要写一次(用光标两次)我的问题是关于如何使用光标并且只写一次名字。
    • 您可以使用动态游标并查询 ALL_TAB_COLUMNS 以便为 INSERT 和 SELECT 生成列列表。
    • ALL_TAB_COLUMNS 用于 * ?如果我想要除一列之外的所有列?
    • 您只需添加“WHERE COLUMN_NAME != column_I_dont_want
    【解决方案3】:

    看起来您正在寻找捷径以避免在insert 语句中限定列名。

    好吧,虽然我不推荐这样做,但它可以做到,但它有点乏味。这是一个例子:

    1. 如果你有一张桌子employee (employee_id, employee_name, designation)。您需要在数据库中创建两种类型-

      一个。类似于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;
          /
      

    【讨论】:

      【解决方案4】:

      对于更快的插入,请使用批量收集/FORALL 插入而不是单数插入。查找以下示例...

      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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-09
        • 2021-03-11
        • 2016-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多