2015-07-13 68 views
1

我有這種類型的功能:使用功能的Oracle

FUNCTION mfi_cust_details (vacid VARCHAR2) 
     RETURN VARCHAR2 
    IS 
     vcustdetails VARCHAR2 (300); 
    BEGIN 
     BEGIN 
     SELECT a.cust_title_code 
       || ',' 
       || a.cust_id 
       || ',' 
       || b.address_line1 
       || ',' 
       || b.address_line2 
       || ',' 
       || mfi_citycountry (b.country, b.city) 
       || ',' 
       || b.zip 
      INTO vcustdetails 
      FROM tbaadm.cmg a, crmuser.address b 
      WHERE TRIM (a.cif_id) = TRIM (b.orgkey) 
      AND UPPER (b.addresscategory) IN ('MAILING', 'REGISTERED') 
      AND cust_id IN (SELECT cust_id 
          FROM tbaadm.gam 
          WHERE acid = vacid); 
     EXCEPTION 
     WHEN NO_DATA_FOUND 
     THEN 
      vcustdetails := 
        NULL 
       || ',' 
       || NULL 
       || ',' 
       || NULL 
       || ',' 
       || NULL 
       || ',' 
       || NULL 
       || ',' 
       || NULL 
       || ',' 
       || NULL; 
     END; 

     RETURN vcustdetails; 
    END mfi_cust_details; 

,我需要從這些數據插入到表,例如:

insert into my_table values(mfi_cust_details(myacid),anotherFunction()); 

,但我的程序是甚至沒有編譯一個錯誤:

not enough values 

是什麼我試圖做甚至可能嗎?

編輯 我的表定義

create table my_table cust_title_code varchar2(10), 
cust_id varchar2(10), 
address1 varchar2(10), 
address_2 varchar2(10), 
city_code varchar2(5), 
country_code varchar2(5), 
zip_code varchar2(10)); 
+1

您需要'INSERT INTO..SELECT'語句。 –

+1

有多少列有在MY_TABLE?如果不是2(由你的價值觀語句定義),我使用的其他值光標內插入它不會工作 – davegreen100

+0

@ davegreen100。 – ErrorNotFoundException

回答

3

你的函數定義爲返回一列 - 這是字符串「值,值,值」等(或「空,空,空」等) [雖然我看不到用錯誤插入my_table的所有空值!]。插入失敗,因爲插入表(不包含指定的列列表)將默認按表中定義的順序插入所有列,但由於您的函數返回一列,所以失敗時顯示「值不足」。

看樣子你想多列工藝融入插入語句 - 我如果不相信有辦法做到這一點。

可以定義功能爲它返回一個ROWTYPE這基本上代表了從該表中的一個記錄:

FUNCTION mfi_cust_details(vacid VARCHAR2) return my_table%ROWTYPE as 
    my_table%ROWTYPE vcustdetails; 
BEGIN 
    SELECT a.cust_title_code, 
    a.cust_id, 
    b.address_line1, 
    b.address_line2, 
    mfi_citycountry (b.country, b.city), 
    b.zip 
    INTO vcustdetails 
    FROM tbaadm.cmg a, crmuser.address b 
      WHERE TRIM (a.cif_id) = TRIM (b.orgkey) 
       AND UPPER (b.addresscategory) IN ('MAILING', 'REGISTERED') 
       AND cust_id IN (SELECT cust_id 
           FROM tbaadm.gam 
           WHERE acid = vacid); 

    RETURN vcustdetails; 
END; 

不過,你需要做的PL/SQL塊內的實際插入語句(即BEGIN/END)。

declare 
    my_table%ROWTYPE rec; 
begin 

    rec := mfi_cust_details('id'); 

    insert into my_table(cust_title_code, cust_id, address1, address_2, city_code, country_code, zip_code) 
    values (rec.cust_title_code, rec.cust_id, rec.address1, rec.address_2, rec.city_code, rec.country_code, rec.zip_code); 

    -- don't forget to commit; 

end; 
+0

將這項工作如果我有沒有來自其他功能價值?該表的列數多於在一個函數中返回的列數。我有另外兩個函數插入到同一個表中。 – ErrorNotFoundException

+0

是的,但您需要聲明單獨的變量並分別調用您的函數。然後,您可以將這些變量添加到插入列表中。或者,如果函數返回一列,則可以直接內聯....(....,zip,anotherFunction()); – Richard