Можно ли вставить запись с типом строки X в таблицу с типом строки Y?

Я застрял с чем-то действительно странным. Вчера я смог произвести такую ​​процедуру:

create or replace PROCEDURE proc
IS
  CURSOR CUR
  IS
    SELECT * FROM PROVA
    WHERE STATUS = 'X';

BEGIN
  FOR H IN CUR
  LOOP
    BEGIN
      INSERT INTO PROVA2 VALUES H;
      DELETE FROM PROVA WHERE ID = H.ID;
      COMMIT;
    END;
  END LOOP;
END;

Где ПРОВА определяется как:

CREATE TABLE PROVA
   (    "ELEMENTO" VARCHAR2(20 BYTE), 
    "DATO" VARCHAR2(20 BYTE), 
    "NUMERO_TENTATIVI" NUMBER(8,0), 
    "STATUS" VARCHAR2(1000 BYTE), 
    "ID" NUMBER(*,0)
   )

и PROVA2 определяется как:

CREATE TABLE PROVA
   (    "ELEMENTO" VARCHAR2(20 BYTE), 
    "DATO" VARCHAR2(20 BYTE), 
    "NUMERO_TENTATIVI" NUMBER(8,0), 
    "STATUS" VARCHAR2(1000 BYTE), 
    "ID" NUMBER(*,0)
    "DATE_TIME" TIMESTAMP (6) DEFAULT CURRENT_TIMESTAMP
   )

К сожалению, моя ошибка, я не сохранил и не передал правильную процедуру, поэтому теперь я застрял в старой (где, когда я делаю вставку, я должен указать каждый столбец...

INSERT INTO PROVA2(bla,bla,bla...) 
      VALUES (bla,bla,bla...);

Я бы хотел, чтобы часть INSERT абстрагировалась от структуры таблицы, и я искал везде, но я не нашел никаких доказательств ошибки, которую дает мне первая ПРОЦЕДУРА, которую я разместил, а именно:

 ORA-00947: not enough values

Поэтому мой вопрос: возможно ли вставить полную запись из таблицы X в таблицу Y, в которой есть те же столбцы, кроме DATE_TIME со значением по умолчанию (и я не хочу изменять...).

Я надеюсь, что это не грязно, и я искал повсюду в Интернете об этом без удачи.

Благодарю.

РЕДАКТИРОВАТЬ: Подводя итог: учитывая таблицу A, которая имеет foo, bar, foobar в качестве столбцов, где foobar имеет значение по умолчанию: могу ли я вставить запись 'x' из таблицы B, которая имеет foo, bar в качестве столбцов, используя:

вставить в значения А х

Спасибо

1 ответ

Решение

Вы можете использовать вид, чтобы сделать это:

create table tmp(
id number
);
create table tmp1(
id number,
dt date default sysdate
);
create view tmp1_vw as select id from tmp1;
insert into tmp1_vw values (1);

результат:

table TMP created.
table TMP1 created.
view TMP1_VW created.
1 rows inserted.

Ваша процедура работает также:

declare
  CURSOR CUR
  IS
    SELECT * FROM tmp;
BEGIN
  FOR H IN CUR
  LOOP
    BEGIN
      INSERT INTO tmp1_vw VALUES H;
    END;
  END LOOP;
END;

И не делайте коммит после каждого утверждения.


Продолжайте после 1-го комментария.

У вас есть 2 таблицы с немного другой структурой.

Чтобы решить эту проблему, вы создаете вид на второй стол, который будет выглядеть точно так же, как и первый. Тогда ваши "типы записей", полученные из первой таблицы, также будут работать с представлением.

Другие вопросы по тегам