【问题标题】:Cursor in pl/sqlpl/sql 中的光标
【发布时间】:2018-11-02 05:04:36
【问题描述】:

我有 ORACLEairport_t,其中包含

的数据字段
Rank,
Airport,
Location,
Country,
Code_IATA,
Code_ICAO,
Total_passenger,
Rank_change,
Percent_Change

我创建了表 AIRPORTS2017OO,它有一个单独的列 AIRPORT,可以存储 airport_t 类型的对象。我在 Airport2017 表中有 50 行数据,我使用光标将这些数据插入到表 AIRPORTS2017OOairport 列中。

我可以通过下面给出的光标遍历 airports2017 表,但我不知道如何将数据插入到 AIRPORTS2017OO 表中。

这是我从 airports2017 表中获取所有信息的解决方案

DECLARE
   rank1        NUMBER;
   airports1    VARCHAR2 (80);
   location1    VARCHAR (40);
   country1     VARCHAR (30);
   iata1        VARCHAR (3);
   icao1        VARCHAR (4);
   total_pass   NUMBER;
   rank_c       NUMBER;
   p_change     NUMBER;

   CURSOR display
   IS
      SELECT * FROM airports2017;
BEGIN
   OPEN display;

   LOOP
      FETCH display
         INTO rank1,
              airports1,
              location1,
              country1,
              iata1,
              icao1,
              total_pass,
              rank_c,
              p_change;

      IF display%FOUND
      THEN
         DBMS_OUTPUT.put_line (airports1);
      ELSE
         EXIT;
      END IF;
   END LOOP;

   CLOSE display;
END;
/

【问题讨论】:

  • 您是否可以控制数据库设计?因为如果我是你,我不会将数据存储在 airport_t 对象中并将其插入到表的列中,而是创建一个具有返回主表的外键的新表,然后将数据插入到新表中桌子。以这种方式查询事情要容易得多。
  • 嘿,不,我无法控制设计。必须坚持给出的问题。

标签: oracle plsql cursor


【解决方案1】:

你知道你可以做到:

INSERT INTO AIRPORTS2017OO select * from airports2017;

而不是所有这些光标代码对吗?

无论如何,这是如何做到的:

DECLARE    
   a_data ARRAY;
   CURSOR display
   IS
      SELECT * FROM airports2017;
BEGIN
   OPEN display;

   LOOP
      FETCH display BULK COLLECT INTO a_data;

      FORALL i IN 1..a_data.COUNT
         INSERT INTO AIRPORTS2017OO VALUES a_data(i);

      IF display%FOUND
      THEN
         DBMS_OUTPUT.put_line (airports1);
      ELSE
         EXIT;
      END IF;
   END LOOP;

   CLOSE display;
END;
/

【讨论】:

  • 嗨,我试过运行它,它显示了多个错误。你能看看吗?对于这个解决方案 INSERT INTO AIRPORTS2017OO 选择 * from airports2017;错误是“值太多”。
  • AIRPORTS2017OO的结构和airports2017一样吗?否则执行“创建表 AIRPORTS2017OO 作为 select * from airports2017”
  • 更好的是,列出您要插入并从中选择的列,例如insert into airports2017oo (col1, col2, ...) select cola, colb, ... from airports2017;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-02
  • 1970-01-01
  • 2013-03-29
  • 1970-01-01
  • 2020-02-26
  • 1970-01-01
相关资源
最近更新 更多