Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 FORALL и default значения в таблице  [new]
pretoreani
Member

Откуда:
Сообщений: 188
есть табличка

CREATE TABLE X1
(
  B1        DATE NOT NULL,
  B2        DATE NOT NULL,
  LOAD_ID         NUMBER(6)                     DEFAULT 22090                 NOT NULL
)

есть вот такой скрипт

DECLARE
   CURSOR xc1
   IS
      SELECT SYSDATE,
             SYSDATE
        FROM DUAL;
   TYPE rc IS RECORD (
      b1 DATE,
      b2 DATE
   );
   TYPE ttable IS TABLE OF rc;
   stg ttable;
BEGIN
   OPEN xc1;
   FETCH xc1 BULK COLLECT INTO stg;
   CLOSE xc1;
   FORALL i IN 1 .. stg.COUNT
      INSERT INTO x1 (b1, b2) VALUES stg (i);
   COMMIT;
END;

не работает, пишет not enough values, почему?
10 июл 07, 14:36    [4372980]     Ответить | Цитировать Сообщить модератору
 Re: FORALL и default значения в таблице  [new]
Дубовая голова
Member [заблокирован]

Откуда: с цепи сорвался
Сообщений: 1821
Нельзя использовать список столбцов, когда используете синтаксис VALUES <<запись>

SQL> CREATE TABLE X1
  2  (
  3    B1        DATE NOT NULL,
  4    B2        DATE NOT NULL,
  5    LOAD_ID         NUMBER(6)                     DEFAULT 22090                 NOT NULL
  6  )
  7  /

Table created.

SQL> DECLARE
  2     CURSOR xc1
  3     IS
  4        SELECT SYSDATE,
  5               SYSDATE
  6          FROM DUAL;
  7     TYPE rc IS RECORD (
  8        b1 DATE,
  9        b2 DATE
 10     );
 11     TYPE ttable IS TABLE OF rc;
 12     stg ttable;
 13  BEGIN
 14     OPEN xc1;
 15     FETCH xc1 BULK COLLECT INTO stg;
 16     CLOSE xc1;
 17     FORALL i IN 1 .. stg.COUNT
 18        INSERT INTO (SELECT b1, b2 FROM x1) VALUES stg (i);
 19  END;
 20  /

PL/SQL procedure successfully completed.

SQL> select * from x1;

B1                   B2                      LOAD_ID
-------------------- -------------------- ----------
10-JUL-2007 14:46:42 10-JUL-2007 14:46:42      22090
10 июл 07, 14:48    [4373133]     Ответить | Цитировать Сообщить модератору
 Re: FORALL и default значения в таблице  [new]
pretoreani
Member

Откуда:
Сообщений: 188
Дубовая голова
Нельзя использовать список столбцов, когда используете синтаксис VALUES <<запись>


Спасибо, отпустило :)
10 июл 07, 15:08    [4373330]     Ответить | Цитировать Сообщить модератору
 Re: FORALL и default значения в таблице  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116133
pretoreani


К тому что написал Дубовая голова хочу добавить только, что
это очевидно сильно упрощенный тестовый пример.
В противном случае

INSERT INTO x1 (b1, b2) VALUES (sysdate, sysdate)
:-)
10 июл 07, 15:11    [4373349]     Ответить | Цитировать Сообщить модератору
 Re: FORALL и default значения в таблице  [new]
GL
Member

Откуда: Харьков
Сообщений: 1513
Дубовая голова
 18        INSERT INTO (SELECT b1, b2 FROM x1) VALUES stg (i);

А с update так же можно придумать? Не перечисляя field=value?
11 июл 07, 06:37    [4376024]     Ответить | Цитировать Сообщить модератору
 Re: FORALL и default значения в таблице  [new]
Amberit
Member

Откуда: Киев
Сообщений: 765
C UPDATE можно попробовать следующую конструкцию:

UPDATE таблица
SET ROW = некая_запись_со_значениями строки
11 июл 07, 08:13    [4376100]     Ответить | Цитировать Сообщить модератору
 Re: FORALL и default значения в таблице  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
GL
А с update так же можно придумать? Не перечисляя field=value?
Проапдейтить все поля записи? А в этом может быть какой-то сельскохозяйственный смысл?
11 июл 07, 10:41    [4376708]     Ответить | Цитировать Сообщить модератору
 Re: FORALL и default значения в таблице  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116133
Jannny
GL
А с update так же можно придумать? Не перечисляя field=value?
Проапдейтить все поля записи? А в этом может быть какой-то сельскохозяйственный смысл?


Мне все таки кажется, что это был вопрос о существовании более или менее аналогичного
синтаксиса UPDATE. Кстати ответ для меня оказался не до конца очевидным

DECLARE
       CURSOR xc1
       IS
          SELECT SYSDATE+1,
                 SYSDATE+1
            FROM DUAL;
       TYPE rc IS RECORD (
          b1 DATE,
          b2 DATE
      );
      TYPE ttable IS TABLE OF rc;
      stg ttable;
   BEGIN
      OPEN xc1;
      FETCH xc1 BULK COLLECT INTO stg;
      CLOSE xc1;
      FORALL i IN 1 .. stg.COUNT
         UPDATE (SELECT b1, b2 FROM x1) SET ROW = stg (i);
   END;
/
SQL> select * from x1
/
 
B1          B2
----------- -----------
12.07.2007  12.07.2007
 
SQL> 
11 июл 07, 11:47    [4377323]     Ответить | Цитировать Сообщить модератору
 Re: FORALL и default значения в таблице  [new]
GL
Member

Откуда: Харьков
Сообщений: 1513
dmidek
         UPDATE (SELECT b1, b2 FROM x1) SET ROW = stg (i);

Спасибо большое - уже несколько раз натыкался на задачу вставки/обновления из коллекции, каждый раз перечислял все обновляемые поля...
11 июл 07, 18:48    [4380564]     Ответить | Цитировать Сообщить модератору
 Re: FORALL и default значения в таблице  [new]
Двоюшник
Member

Откуда: Киев
Сообщений: 1135
GL
dmidek
         UPDATE (SELECT b1, b2 FROM x1) SET ROW = stg (i);

Спасибо большое - уже несколько раз натыкался на задачу вставки/обновления из коллекции, каждый раз перечислял все обновляемые поля...

фтопку такой подход...
11 июл 07, 18:52    [4380584]     Ответить | Цитировать Сообщить модератору
 Re: FORALL и default значения в таблице  [new]
Дубовая голова
Member [заблокирован]

Откуда: с цепи сорвался
Сообщений: 1821
Двоюшник
фтопку такой подход...


...если есть альтернатива в виде обычного оператора DML.
11 июл 07, 18:56    [4380603]     Ответить | Цитировать Сообщить модератору
 Re: FORALL и default значения в таблице  [new]
GL
Member

Откуда: Харьков
Сообщений: 1513
Дубовая голова
Двоюшник
фтопку такой подход...


...если есть альтернатива в виде обычного оператора DML.

Бывают разные подходы. Бывают разные задачи ;)
11 июл 07, 19:54    [4380759]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить