2017-05-04 17 views
0

我有兩個表書和文章如下,甲骨文PLSQL嵌套遊標循環問題:沒有得到預期的效果

enter image description here

enter image description here

我想複製所有文章每本書如下,

enter image description here

但要重複BOOKID一些記錄2(最後3行)。

enter image description here

這裏是我的腳本。請建議替代解決方案。

DECLARE 
    CURSOR bookRecords IS SELECT ID FROM BOOK; 
    CURSOR articleRecords IS SELECT ID,NAME,BOOK_ID FROM ARTICLE; 
BEGIN 
    FOR bookRecord IN bookRecords LOOP 
    FOR articleRecord IN articleRecords LOOP 
     INSERT INTO ARTICLE (ID,NAME,BOOK_ID) VALUES (ARTICLE_ID_SEQ.nextVal, 
articleRecord.NAME, bookRecord.ID); 
    END LOOP; 
    END LOOP; 
    EXECUTE IMMEDIATE 'DELETE FROM ARTICLE WHERE BOOK_ID IS NULL'; 
    COMMIT; 
END; 
+2

請閱讀http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of-code-on-so-when-asking-a-question/285557和接受的答案 –

回答

2

是不是隻是:

insert into article 
    (id 
    , name 
    , book_id) 
select article_id_seq.nextval 
    , a.name 
    , b.id 
from article a cross join book b; 

這將創建一個ARTICLE新行的ARTICLEBOOK每個組合。我不確定這是做什麼感覺,但在技術層面,這是你怎麼做的。

您可能還想使用minusnot exists結構排除已存在的組合。

+0

又一個交叉連接。 – xQbert

+0

ARTICLE和BOOK不是來自Application的真實實體。他們只是從應用程序描述場景。所以bookId最近在Article表中引入,每一個現有的文章都需要與每本書相關聯。 – Raju

4

您不應該爲此使用遊標。只需cross join,它結合了兩個表中的每一行,就像你想要的一樣。

您可以插入作爲此聲明的基礎,但根據您要完成的任務,我認爲您應該插入到新表中,而不是現有的文章表中。因爲這會保留您剛剛列出文章的現有表格(很有可能是有用的東西)。

insert into new_combined_book_article_table (id, name, book_id) 
    select row_number() over (order by books.id),articles.name,books.id 
     from books 
     cross join articles 
+0

「選擇row_number()over(),article.name,book.id從book交叉連接文章;」返回錯誤「ORA-30485:在窗口規範中缺少ORDER BY表達式」。另外我怎樣才能在每本書的文章中插入行? – Raju

+1

@Raju,對不起,我不是甲骨文的用戶 - 沒有意識到甲骨文強制聲明訂單。我已更新查詢。更新插入,也。 – 2017-05-04 12:38:15

+0

如果你只是想要一個行號,可能'rownum'會這麼做。 –