Я могу получить точную ошибку только тогда, когда pAttachment
является нулевым или пустым (проверено в 10.2.0.5).Если это не так, я получаю ORA-21560
вместо этого, так как ему не нравится lobmaxsize
.Если я сделаю это вместо этого, все будет в порядке:
dbms_lob.write(vATTACHMENT, dbms_lob.getlength(:pATTACHMENT), 1, :pATTACHMENT));
Но из ваших комментариев у вас возникли проблемы со ссылками на переменную bind более одного раза, и по какой-то причине я не совсем понимаю, что вы не можете выполнять назначенияв PL / SQL как :=
неверно истолковано - что делает использование PL / SQL вообще непрактичным, я бы подумал.Мне немного неясно, запускаете ли вы это как анонимный блок прямо из вашего клиента;если так, может быть, вам следует рассмотреть вопрос о том, чтобы сделать это хранимой процедурой, чтобы избежать обеих этих проблем?Затем вы можете просто сделать:
vATTACHMENT := :pATTACHMENT;
... хотя тогда это будет параметр, передаваемый в процедуру, а не переменная связывания, и вам не понадобится оба с копией в первую очередь(как предлагает Дейв Коста).
Если вы застряли с таким запуском, вы можете воспользоваться переключением контекста и сделать:
select :pATTACHMENT into vATTACHMENT from dual;
Но это не идеально;если вы просто хотите сделать копию, почему вы не используете процедуры копирования ?
dbms_lob.copy(vATTACHMENT, :pATTACHMENT, dbms_lob.getlength(:pATTACHMENT));
..., которые все равно ломают ваши re-referencing-bind-variableограничение, но этот действительно понимает lobmaxsize
:
dbms_lob.copy(vATTACHMENT, :pATTACHMENT, dbms_lob.lobmaxsize);
Вы все равно получите сообщение об ошибке (я думаю, что ORA-22994), если :pATTACHMENT
пусто или равно нулю, так что вам нужно будет сделатьубедитесь, что это не до вызова блока или проверить внутри.