我正在尝试将LONG RAW值转换为BLOB值并且我收到错误:ORA-00932:不一致的数据类型:预期BINARY,得到LONG BINARY。 代码示例(文档是LONG RAW列):
DECLARE
var_blob BLOB;
BEGIN
select To_Blob(document) into var_blob
from instructions
where id = 'XXX';
END;
如果我尝试将代码作为简单的SQL查询(没有PL / SQL代码)执行,我会得到同样的错误。 我做错了什么?
修改
使用我尝试过的答案中的信息:
create table temp_blob(id VARCHAR2(50), file_contents blob);
然后:
DECLARE
z_id varchar(50) := 'XXX';
z_blob blob;
BEGIN
execute immediate '
insert into temp_blob
select :z_id, To_Blob(document)
from instructions
where id = :z_id' using z_id, z_id;
begin
select file_contents into z_blob
from temp_blob where id = z_id;
end;
END;
我仍然遇到同样的错误。还有一些额外的信息 - 查询结果的大小:
select document
from instructions
where id = 'XXX';
大于32760字节,因此我无法将其分配给PL / SQL变量。
答案 0 :(得分:0)
我很难解决,但得到了一个有效的代码。
declare
l_long_row long raw := rpad( 'a', 2000, 'a' );
l_blob blob;
l_id number;
begin
execute immediate 'select
1,
TO_BLOB(:l_long_row)
into
:l_id,
:l_blob
from dual'
into l_id, l_blob
using l_long_row;
insert into test_blob
(select
1,
l_blob
from dual);
end;
其中table test_blob具有属性ID(编号)和BIGBLOB(BLOB);
希望它有所帮助。
答案 1 :(得分:0)
您可以从Tom Kyte的博客中获得答案。他已经回复了here
<强>编辑:强>
我们应该使用TO_LOB而不是TO_BLOB。
让我们看一下:
创建两个表:
create table instructions (id varchar2(50), document long raw);
create table temp_blob(id VARCHAR2(50), file_contents blob);
在DOCUMENT列中填充INSTRUCTIONS,其数据超过32767字节(以确保不会发生对pl / sql varchar2的隐式转换)。为此,我使用这个小解决方案(在C#中):
using System;
using System.Data;
using Oracle.DataAccess.Client;
namespace LongRaw
{
class Program
{
static void Main(string[] args)
{
using (OracleConnection connection = new OracleConnection("Data Source=XE;User ID=<user_name>;Password=<user_pass>;Pooling=yes;"))
{
connection.Open();
using (OracleCommand command = new OracleCommand("insert into instructions values (:id, :document)", connection))
{
Random random = new Random();
byte[] document = new byte[65535];
random.NextBytes(document);
command.Parameters.Add("id", "XXX");
command.Parameters.Add("document", OracleDbType.LongRaw, 65535, val: document, dir: ParameterDirection.Input);
command.ExecuteNonQuery();
}
connection.Close();
}
}
}
}
现在我们在INSTRUCTIONS中有数据并执行我们的pl / sql-block:
SQL> set echo on
SQL> set serveroutput on
SQL>
declare
z_id varchar(50) := 'XXX';
z_blob blob;
begin
execute immediate
'insert into temp_blob
select :z_id, to_lob(document)
from instructions
where id = :z_id' using z_id, z_id;
select file_contents into z_blob
from temp_blob where id = z_id;
dbms_output.put_line(dbms_lob.getlength(z_blob) || ' bytes');
end;
/
65535 bytes
PL/SQL procedure successfully completed
SQL>
我们在这里 - 我们的z_blob包含65535个字节:)