2017-04-21 44 views
-1

如何在pl/SQL中使用过程在嵌套表中插入数据?通过程序在pl/sql中嵌套表插入数据

如何通过过程在嵌套表中传递参数?

CREATE OR REPLACE TYPE "CYBER_B" AS OBJECT 
(REC_ID VARCHAR2(250), 
    START_DATE TIMESTAMP, 
    END_DATE TIMESTAMP, 
    CREATION_DATE TIMESTAMP, 
    ADV_DURATION TIMESTAMP, 
    ADV_IMAGE BLOB, 
    IMG_FILENAME VARCHAR2(250), 
    IMG_MIMETYPE VARCHAR2(250) 
); 
CREATE TYPE CYBERB1 AS TABLE OF CYBER_B; 

CREATE TABLE "CYBER1_TABLE" 
    ( "AD_ID" VARCHAR2(64), 
    "USERNAME" VARCHAR2(250) NOT NULL ENABLE, 
    "SELLER_DETAIL1" "CYBERB1" , 
    PRIMARY KEY ("AD_ID") ENABLE 
    ) 
NESTED TABLE "SELLER_DETAIL1" STORE AS "ADV1_DETAIL"; 

cyber_b是对象 cyberb1是类型 cyber_table是我的表

我想创造出在嵌套表

+0

请发帖,你有什么尝试,直到现在,你示例代码库,您的示例数据。 –

+0

[示例](http://www.dba-oracle.com/t_insert_nested_table.htm) – Nitish

回答

0

嵌套表的事情是我们需要实例化对象,表类型和行类型。像这样

table_type(row_type(1,1), row_type(2,1), row_type(3,1)) 

确保括号是成对的。

这将在嵌套表中插入一条记录到表中,其中一个文件:

insert into CYBER1_TABLE (
    AD_ID, 
    USERNAME, 
    SELLER_DETAIL1) 
values (
    'ADID123' 
    , 'JOESOAP' 
    , cyber_b1(cyber_b(REC_ID => 'ABC', 
        START_DATE => date '2017-05-01', 
        END_DATE => date '2017-05-31', 
        CREATION_DATE => systimestamp, 
        ADV_DURATION => systimestamp, 
        ADV_IMAGE => null 
        IMG_FILENAME => 'example.png', 
        IMG_MIMETYPE => 'image/png' 
       ) 
     ) 
); 

加载BLOB就留给读者自己练习:)。

0

插入数据在更新语句的过程:

CREATE PROCEDURE add_cyber1_seller_detail(
    in_ad_id CYBER1_TABLE.AD_ID%TYPE, 
    in_seller CYBER_B 
) 
IS 
BEGIN 
    UPDATE cyber1_table 
    SET seller_detail1 = COALESCE(seller1_detail, CYBERB1()) 
          MULTISET UNION ALL 
          CYBERB1(in_seller) 
    WHERE ad_id = in_ad_id; 
END; 
/

使用PL/SQL:

CREATE PROCEDURE add_cyber1_seller_detail(
    in_ad_id CYBER1_TABLE.AD_ID%TYPE, 
    in_seller CYBER_B 
) 
IS 
    sellers CYBERB1; 
BEGIN 
    SELECT seller_detail1 
    INTO sellers 
    FROM cyber1_table 
    WHERE ad_id = in_ad_id 
    FOR UPDATE OF seller_detail1; 

    IF sellers IS NULL THEN 
    sellers := CYBERB1(in_seller); 
    ELSE 
    sellers.EXTEND(1); 
    sellers(sellers.COUNT) := in_seller; 
    END IF; 

    UPDATE cyber1_table 
    SET seller_detail1 = sellers 
    WHERE ad_id = in_ad_id; 
END; 
/