2016-03-22 3 views
1

Мой код функции/PLSQL, как показано ниже:PLSQL ошибка максимальная CLOB длина

function build_update(p_table_name varchar2) --function to build update statement 
return varchar2 
    as 
    t_string CLOB;     
begin 
for i in (select column_name from ALL_TAB_COLS where table_name = p_table_name) 
loop 
    t_string := t_string || i.column_name||'='||' b' ||'.'||i.column_name||','; 

end loop; 
    t_string := to_clob(to_char(substr(t_string, 1, instr(t_string, ',', -1)-1))); 
       return t_string; 

end; 

При создании динамического обновления SQL для использования в слиянии, он показывает ошибку, как можно связать LONG значение только для вставки в ДОЛГОВАЯ колонка.

Даже если использовать CLOB, он не может принимать больше символов. У меня только 152 столбца в моей таблице, и для них я делаю column_nameA = B.column_nameA.

Пожалуйста, помогите

+0

присвоение последнего t_string не в состоянии взять длинную строку, даже если я объявил его как CLOB.As фас я знаю, он должен столько, сколько символов, он wants.All персонажи приходят около 20000 characters.Than , в чем проблема –

ответ

0

Поскольку результат может быть большой, чтобы справиться в varchar2 (размер>32512 на моей системе), вы должны ввести ваше возвращаемое значение как CLOB, чтобы избежать ошибки. Но тогда вы должны обработать CLOB в вашем коде, что весело.

declare 
    function build_update(p_table_name varchar2) --function to build update statement 
    return clob as 
     t_string CLOB;     
    begin 
     for i in (select column_name from ALL_TAB_COLS where table_name = p_table_name) 
     loop 
      t_string := t_string || i.column_name||'='||' b' ||'.'||i.column_name||','; 
     end loop; 

     t_string := substr(t_string, 1, instr(t_string, ',', -1)-1); 
     return t_string; 

    exception 
      when others then 
       dbms_output.put_line(sqlerrm); 
       dbms_output.put_line(length(t_string)); 
       return 'kaput'; 
    end; 

begin 
dbms_output.put_line(substr(build_update('MY_TABLE'), 1, 32512)); 

exception 
     when others then 
      dbms_output.put_line('-in-main:'||sqlerrm); 
end; 
/
+0

Спасибо большое. Он работал :-) –