Oracle:LONG RAW到BLOB - ORA-00932:不一致的数据类型

时间:2017-05-12 09:56:45

标签: sql oracle plsql

我正在尝试将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变量。

2 个答案:

答案 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个字节:)