Можно ли вставить запись с типом строки 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 таблицы с немного другой структурой.
Чтобы решить эту проблему, вы создаете вид на второй стол, который будет выглядеть точно так же, как и первый. Тогда ваши "типы записей", полученные из первой таблицы, также будут работать с представлением.