1

我正在使用 Oracle 的异构服务 (HS)。我有一个指向 Microsoft Access 表的数据库链接,名为employee. 通过使用 SQL*Plus 的 Oracle 连接,我可以描述表的列和数据类型 ( desc employee)。我还可以从远程表中选择并接收记录。

但是,当使用匿名块时,我收到 Oracle 错误:

ORA-02070: database MSAccessODBC64 does not support TO_NUMBER in this context

MSAccessODBC64是我在 Windows 7 中配置的 ODBC DSN。

编码:

declare
   my_record_position number := 60109;
   my_record employee@MSAccessODBC64bit%rowtype;
begin
   select
      *
   into
      my_record
   from
      eemployee@MSAccessODBC64bit ---->> When I remove the database link, it works
   where
      staff_number = my_record_position ---->> when I remove the where clause, it works
   order by
      staff_number asc;
   dbms_output.put_line(my_record.staff_number);
end;
/

错误:

   declare
      *
   ERROR at line 1:
   ORA-02070: database MSAccessODBC64 does not support TO_NUMBER in this context
   ORA-06512: at line 5

是否需要某种问题或选项才能使 HS 工作?我在看什么?

当我使用替换变量时,它会起作用并显示employee id.

define emp = 60109;
declare
   my_record_position number := 60109;
   my_record employee@MSAccessODBC64bit%rowtype;
begin
   select
      *
   into
      my_record
   from
      employee@MSAccessODBC64bit
   where
      staff_number = &emp
   order by
      staff_number asc;
   dbms_output.put_line('emp=' || my_record.staff_number);
end;
/
emp=60109

PL/SQL procedure successfully completed.

===========initMSAccessODBC64bit.ora for ODBC==============

# This is a sample agent init file that contains the HS parameters that are
# needed for the Database Gateway for ODBC

#
# HS init parameters
#
HS_DESCRIBE_CACHE_HWM   = 4000
HS_FDS_CONNECT_INFO     = MSAccessODBC64bit
HS_FDS_TRACE_LEVEL      = DEBUG
HS_OPEN_CURSORS         = 50
HS_RPC_FETCH_REBLOCKING = ON
HS_RPC_FETCH_SIZE       = 10000
HS_FDS_FETCH_ROWS       = 100
HS_TRANSACTION_MODEL    = READ_ONLY

#This was supposed to fix ORA-02070: database MSAccessODBC64bit does not
#support TO_number in this context
#This didn't work
#EnableWCharSupport      = 0 
4

2 回答 2

1

解决了!就可以执行的游标 sql 语句而言,HS 和 ODBC Oracle 服务的范围和使用受到限制。解决方法是使用虚拟 DBMS_HS_PASSTHROUGH 包。这将允许您使用 pl/sql 变量和绑定变量向远程数据库提交查询。下面的示例是上述代码的替换。

例子:

declare
   v_cursor           BINARY_INTEGER;
   my_record_position number := 1234;
   my_record          employees@MSAccessODBC64bit%rowtype;
   my_empid           employees.empid@MSAccessODBC64bit%type;
begin
   v_cursor := DBMS_HS_PASSTHROUGH.open_cursor@MSAccessODBC64bit;
   DBMS_HS_PASSTHROUGH.parse@MSAccessODBC64bit
      (
      v_cursor,
      'select * from employee where empid = ' || my_record_position 
      || 'order by empid asc'
      );
   WHILE DBMS_HS_PASSTHROUGH.fetch_row@MSAccessODBC64bit(v_cursor) > 0
   LOOP
      DBMS_HS_PASSTHROUGH.get_value@MSAccessODBC64bit(v_cursor, 1,my_record.empid);
      dbms_output.put_line('empid=' || my_record.empid);
   end loop;
end;
/
于 2017-01-03T17:19:33.700 回答
0

错误表明这个比较——

staff_number = my_record_position

-- 比较不同的数据类型,这导致查询 DBMS 自动尝试将一个或两个转换为可以比较的数据类型。例如,您不能直接将 aCHAR与 a进行比较NUMBER;一个必须是CAST另一个 -TO_NUMBER暗示正在发生。

TO_NUMBER是特定于 Oracle 的函数,Access 不支持该函数。您可以通过CAST在查询中添加几个 s 来解决这个问题,例如 -

CAST (staff_number AS INT) = CAST (my_record_position AS INT)

如果其中任何一个已经是 ,这会增加一些不必要的开销INT,但这对您的使用可能无关紧要。

于 2017-01-03T16:28:38.387 回答