2015-07-13 2 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 

- все, что я пытаюсь сделать, даже возможно?

EDIT Мои определения таблицы

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

Ваша функция определена как возвращающая один столбец - который является строка "значение, значение, значение" и т.д. (или "Null, NULL, NULL" и т.д.) [хотя я не вижу использования вставки всех нулевых значений в my_table при ошибке!]. Вставка не работает, поскольку вставка в таблицу (без указанного списка столбцов) будет по умолчанию включать все столбцы в порядке, определенном в таблице, но так как ваша функция возвращает один столбец, она терпит неудачу с «Недостаточно значений».

Похоже, вы пытаетесь создать несколько столбцов в инструкции insert - я не уверен, есть ли способ сделать это.

Вы могли определить свою функцию как то, что возвращает 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

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