2013-12-06 4 views
0

У меня возникли проблемы с удалением определенной записи из таблицы (ORACLE DB). У меня есть таблица с вложенной таблицей внутри нее.Удаление определенной записи из вложенной таблицы Oracle DB

Структура таблицы выглядит следующим образом: где ML - вложенная таблица

Name, City, ML(Brand, Model, ID, Year, Price) 

Что мне нужно сделать, это удалить конкретную запись с идентификатором «L201».

То, что я пытался до сих пор:

SELECT B.ID FROM TABLE Dock A, Table(A.ML) B; 

Это работает давая мне все идентификаторы.

Выход:

ID 
____ 
B201 
S196 
L201 

Это не работает при попытке удалить запись:

DELETE FROM Dock 
(SELECT B.ID FROM Dock A, Table(A.ML) B) C 
WHERE C.ID = 'L201'; 

Получение ошибки:

Line 2: SQL command not properly ended;

DELETE FROM TABLE 
(SELECT D.ML FROM Dock D) E 
WHERE E.ID = 'L201'; 

Выдает ошибку:

single-row subquery returns more than one row

ответ

0

Может быть, это одна:

DELETE FROM 
    (SELECT A.Name, A.City, d.Brand, d.Model, d.ID, d.Year, d.Price 
    FROM Dock A, TABLE(ML) d) 
WHERE ID = 'L201'; 

Update: Другое исследование, прежде чем мы будем делать это более продвинутая:

DELETE FROM Dock 
WHERE ROWID =ANY (SELECT a.ROWID FROM Dock a, TABLE(ML) b WHERE b.ID = 'L201'); 

Update 2: Если вы предпочитаете более object- ориентированный, этот тоже должен работать. По крайней мере, я не получил никаких ошибок.

CREATE OR REPLACE TYPE ML_TYPE AS OBJECT (
    brand VARCHAR2(100), 
    ID VARCHAR2(20), 
    MODEL VARCHAR2(20), 
    YEAR NUMBER, 
    Price NUMBER, 
MAP MEMBER FUNCTION getID RETURN VARCHAR2, 
CONSTRUCTOR FUNCTION ML_TYPE(ID IN VARCHAR2) RETURN SELF AS RESULT); 


CREATE OR REPLACE TYPE BODY ML_TYPE IS 

CONSTRUCTOR FUNCTION ML_TYPE(ID IN VARCHAR2) RETURN SELF AS RESULT IS 
-- Constructor to create dummy ML-Object which contains just an ID, 
-- used for comparison 
BEGIN 
    SELF.ID := ID; 
    RETURN; 
END ML_TYPE; 

MAP MEMBER FUNCTION getID RETURN VARCHAR2 IS 
BEGIN 
    RETURN SELF.ID; 
END getID; 
END; 
/

CREATE OR REPLACE TYPE ML_TABLE_TYPE IS TABLE OF ML_TYPE; 

CREATE TABLE Dock (Name VARCHAR2(20), City VARCHAR2(20), ML ML_TABLE_TYPE) 
NESTED TABLE ML STORE AS ML_NT; 

insert into Dock values ('A', 'NY', ML_TABLE_TYPE(
    ML_TYPE('brand1','L301','Model 2',2013, 1000), 
    ML_TYPE('brand2','L101','Model 3',2013, 1000))); 

insert into Dock values ('B', 'NY', ML_TABLE_TYPE(
    ML_TYPE('brand3','K301','Model 4',2014, 3000), 
    ML_TYPE('brand4','K101','Model 5',2014, 3000))); 

insert into Dock values ('A', 'NY', ML_TABLE_TYPE(
    ML_TYPE('brand5','K301','Model 8',2012, 2000), 
    ML_TYPE('brand6','L201','Model 9',2012, 2000))); 


DELETE FROM Dock WHERE ML_TYPE('L201') MEMBER OF ML; 
+0

Я все еще получаю сообщение об ошибке, что строка подкачки (строка 2) не была закончена. Ошибка в строке 2: команда SQL не была закончена. – user3074445

+0

Если я не укажу имя таблицы в инструкции delete, я получаю такую ​​ошибку: невозможно выполнить DML в выражении или в столбце вида вложенной таблицы – user3074445

+0

Обновлен SQL работал отлично :) Получил 1 строку удалена. – user3074445

0

Прочитав некоторую литературу, я думаю, что нашел правильный способ сделать это.
Определяя функцию сопоставления для вашего типа объекта, вы можете напрямую сравнивать две вложенные таблицы.
Примера:

-- creating the custom object type 
create or replace type ml_type as object (
    brand varchar2(100), 
    id varchar2(20), 
    map member function sort_key return varchar2 
); 
-- creating the object type body and defining the map-function 
create or replace type body ml_type as 
    map member function sort_key return varchar2 is 
    begin 
     return self.brand || '|' || self.id; 
    end; 
end; 
/
-- creating the nested table of custom type 
create or replace type ml_tab as table of ml_type; 

-- deleting from your table by comparing the nested-table elements 
delete from dock where ml = (select ml from dock a, table(a.ml) b where b.id = 'L201'); 

В этом примере карта-функция только возвращение сцепленной версии brand и id, но вы можете определить его к тому, что вы хотите/потребность.

+0

Ошибка в строке 2: ORA-04127: однорядные subquerry вернуть более одной строки – user3074445

+0

@ user3074445 Я отредактировал мой ответ – Armunin

+0

обновление SQL получил все мои строки удалены. Все еще не хорошо :) Теперь он работает так: если есть запись с идентификатором L201, она удаляет все строки. Если их нет, ничего не происходит. – user3074445

Смежные вопросы