Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle PL/SQL、数据库链接和异构服务失败:ORA-02070:数据库MSAccessODBC64bit在此上下文中不支持TO_编号_Oracle_Ms Access_Plsql_Odbc_Heterogeneous Services - Fatal编程技术网

Oracle PL/SQL、数据库链接和异构服务失败:ORA-02070:数据库MSAccessODBC64bit在此上下文中不支持TO_编号

Oracle PL/SQL、数据库链接和异构服务失败:ORA-02070:数据库MSAccessODBC64bit在此上下文中不支持TO_编号,oracle,ms-access,plsql,odbc,heterogeneous-services,Oracle,Ms Access,Plsql,Odbc,Heterogeneous Services,我正在使用Oracle的异构服务HS。我有一个Microsoft Access表的数据库链接,名为employee。通过使用SQL*Plus的Oracle连接,我可以描述表的列和数据类型desc employee。我还可以从远程表中选择并接收记录 但是,当使用匿名块时,我收到Oracle错误: ORA-02070: database MSAccessODBC64 does not support TO_NUMBER in this context MSAccessODBC64是我在Window

我正在使用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

守则: 错误: 是否有一些问题或选择需要使HS工作?我忽略了什么


当我使用替换变量时,它工作并显示员工id


此错误表示此比较失败-

staff_number = my_record_position
-正在比较不同的数据类型,这导致查询DBMS自动尝试将一种或两种数据类型转换为可比较的数据类型。例如,您不能直接将字符与数字进行比较;一个必须投给另一个——to_数字表明这正在发生

TO_NUMBER是Oracle特有的函数,Access不支持该函数。您可能可以通过向查询中添加几个类型转换来解决这个问题,例如-

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

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

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

例子:
如果注释掉dbms_output.put_line调用,会发生什么?另外,最后提到AMGBASETABLES64的错误是什么?嗨,鲍勃,dms_output.put_行工作正常。问题在于HS和ODBC驱动程序。这就是ODBC的dsn。我必须修改这个问题。它应该声明MSAccessODBC64bit。当我使用替换变量时,它可以正常工作。但是,我不能在这个算法中使用替换变量。我需要使用绑定变量或声明的pl/sql变量。如果将第二个示例更改为employee@MSAccessODBC64bit嗨,鲍勃,我刚修好。。。当使用替换变量时,它与远程数据库一起工作。当使用pl/sql声明的变量或绑定变量时,它将不起作用。您好,谢谢您的响应,但这两个变量都是数据类型NUMBER。是的,问题在于比较行,但是HS和ODBC服务由于一些未知的原因被破坏了。我通过使用虚拟包DBMS\u HS\u PASSTHROUGH包解决了这个问题。看到上面的答案,我刚刚发布和链接。
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 
staff_number = my_record_position
CAST (staff_number AS INT) = CAST (my_record_position AS INT)
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;
/