2012-03-16 73 views
1

我有一个采用BLOB作为参数的Oracle PL/SQL例程。 BLOB包含一个.jpg文件。我想将BLOB参数分配给一个局部变量。然后我想插入(或更新)BLOB变量表中的BLOB列。如何从参数中将BLOB复制到Oracle PL/SQL中的局部变量?

我已经试过这样的事情:

declare 
    vATTACHMENT blob; 
begin 
    dbms_lob.createtemporary(vATTACHMENT, false, dbms_lob.session); 
    dbms_lob.write(vATTACHMENT, dbms_lob.lobmaxsize, 1, :pATTACHMENT)); 

    -- do some stuff 

    insert into attachments (attachment, file_name) 
        values (vATTACHMENT, vFILE_NAME); 
end; 

,但我得到了以下错误:

ORA-06502: PL/SQL: numeric or value error 
ORA-06512: at "SYS.DBMS_LOB", line 811 
ORA-06512: at line 21 

我也尝试了直接分配如vATTACHMENT := :pATTACHMENT;但并不希望任何工作。

+0

当您尝试直接分配时,具体的问题是什么? – 2012-03-16 18:51:27

+0

它更多的是执行PL/SQL的组件的一个问题。它认为任何前面带有冒号的参数都是参数,所以它会创建一个参数名称'='。 – 2012-03-16 19:25:05

回答

1

我认为你可以使用DEFAULT在一个变量声明为一个值分配给它,而不使用赋值运营商:=,如:

declare 
    vATTACHMENT blob DEFAULT :pATTACHMENT; 
begin 
    -- rest of your code... 
+0

我选择了这个答案,因为它是最简单的,而且完全符合我的要求:允许我在我的SQL中使用vATTACHMENT,只有一个引用:pATTACHMENT。 – 2012-03-19 14:47:46

0

DBMS_LOB.WRITE的第四个参数应该是RAWVARCHAR2。如果我的理解正确,那么您将现有的BLOB绑定到:pATTACHMENT占位符,因此您传递的是错误的类型。

为什么你需要将它分配给临时BLOB?在我看来,这应该工作:

insert into attachments (attachment, file_name) 
       values (:pATTACHMENT, vFILE_NAME); 

例如,这个运行良好:

DECLARE 
    PROCEDURE insert_blob(p_blob BLOB) IS 
    BEGIN 
    INSERT INTO t_dave (b) VALUES (p_blob); 
    END; 
BEGIN 
    insert_blob(empty_blob()); 
END; 
/
+0

直接插入可以工作,但由于我正在使用的组件,我不能在PL/SQL中多次引用:pATTACHMENT参数,所以我想将它的值复制到局部变量中。然后我可以根据需要经常参考它。 – 2012-03-16 18:37:50

1

我只能得到确切的错误时pAttachment为空或空(在10.2.0.5测试)。如果不是,我得到ORA-21560,因为它不喜欢lobmaxsize。如果我这样做,相反,它是确定:

dbms_lob.write(vATTACHMENT, dbms_lob.getlength(:pATTACHMENT), 1, :pATTACHMENT)); 

但是从你的意见,你有一些问题,引用绑定变量不止一次,出于某种原因,我不太明白你不能在PL完成作业/ SQL as :=被误解了 - 这使得使用PL/SQL在所有方面都有些不切实际,我曾想过。我有点不清楚,如果你直接从客户端运行这个匿名块;如果是这样,也许你应该考虑把它作为一个存储过程来避免这两个问题?然后,您可以只执行:

vATTACHMENT := :pATTACHMENT; 

...虽然那么这将是传递给该过程,而不是一个绑定变量的参数,你就不需要用都摆在首位的复印件(如戴夫科斯塔建议)。

如果你被卡住运行它这样你可能招致上下文切换,并做到:

select :pATTACHMENT into vATTACHMENT from dual; 

但是,这并不理想;如果你只是想复制一份,为什么不使用copy procedures

dbms_lob.copy(vATTACHMENT, :pATTACHMENT, dbms_lob.getlength(:pATTACHMENT)); 

...这就像仍然打破你再引用绑定变量的限制,但是这一次不明白lobmaxsize

dbms_lob.copy(vATTACHMENT, :pATTACHMENT, dbms_lob.lobmaxsize); 

你仍然得到一个错误(ORA-22994我认为)如果:pATTACHMENT为空或空,所以你需要确保它不是在调用该块之前,或者检查内部。

+0

谢谢亚历克斯。我的许多问题都来自我的环境。我在Delphi 7中使用了TADOCommand。我试图编写PL/SQL以适应该组件的一些特质。此外,我_did_尝试dbms_lob.copy(在我看到您的答案之前),但我必须有参数错误,因为我无法让它工作。您的答案中的详细信息+1。 – 2012-03-19 14:54:25

相关问题