数据库A下有个存储过程PA,数据库B下有个过程PB和表TB,TB表中只有一个字段,都是使用函数utl_raw.cast_to_raw转换过的,该字段是PB的返回值,我在A中使用PA调用PB(A与B是通过DBLINK连接的)来获取TB中的值,可传过来的值却显示为‘??’,不能正常显示。请问:通过DBLINK调用存储过程进行数交互的原理是怎样的?与同一库两存储过程调用有没有不同?先谢!

解决方案 »

  1.   

    两边字符集一致嘛show parameter nls_language
      

  2.   

    字符集是不一致的
    现在只想知道存储过程调用原理:比如,PA在调用PB时做了什么?是不是把PB放在本地内存下解析再送数据库服务器处理?那PB返回的记录呢,又是怎么送过来却为‘?’号的呢,要是原样送过来该是原表原始值才对,因为我用select * from TB@DBLINK是可以正常显示的?select与存储过程调用并传送数据的原理有别在哪里?谢谢!
      

  3.   

    PA在调用PB时做了什么?
    调用pb是在远程数据库解析并处理,仅仅反馈结果给pa由于你两边字符集不一致,所以这边无法解析你的结果。select * from TB@DBLINK是可以正常显示的?
    说明你的client端和本地数据库的字符集是一致的。因为你在本地要给远程这个表建立一个公共同义词。相当于本地的表。所以,建议楼主将两边数据库的字符串一致,试试看结果如何呢
      

  4.   

    楼上说的我不能理解
    ------
    select * from TB@DBLINK是可以正常显示的?
    说明你的client端和本地数据库的字符集是一致的。因为你在本地要给远程这个表建立一个公共同义词。相当于本地的表。
    -------
    我的两次反回都是在同一client上运行得到的。wiler(@_@) 说是字符集的原因,那为什么select是可以正常获取的呢?
    还望各位一起来讨论一下,把这个问题搞清楚搞明白,要是分不够再加,再谢!
      

  5.   

    没错,都是在同一个client上得到的
    但是select得到的是本地解析的,而通过procedure得到的是远程解析的
      

  6.   

    继续问题:
    本地解析能不请楼上细谈?也不是说,如果是本地解析,在将server端原始表数据送过来时必然会发现字符集的不同,也就是会出现自动转换的问题,那oracle是如何做到保持不原始数据不变的呢?也是就是在本地解析之前oracle都做了什么?同样,如果在远程(也就是server端)那个字符集自然是远端的字符集,一旦解析完成,还有一个传送到client端的问题?谢谢
      

  7.   

    要真能像你所说这么容易那我还费什么劲呢?
    数据库歇一分钟会有多少损失呐另外,问题我是已经解决了,但问题是我要搞清楚原理
    我是要对端按我的要求建了个视图,我在client上select得到的。
    如果有知道的大哥,请不吝赐教为谢!
      

  8.   

    同意 tgm78(shop34161266.taobao.com)!
    select得到的是本地解析的,而通过procedure得到的是远程解析的
      

  9.   

    我说过,我本地(client)的字符集与server端的不同
    什么叫本地解析?再请问,oracle是怎么完成在不同字符集下解析出汉字来的呢?
    希望能得到详细的解释,相关技术文档也可以,谢谢!
      

  10.   

    数据库A中的procedure 得到的是server端(数据库A)的字符集
    当数据库A与数据库B的字符集不一致时就会出现问题
    而lz所说的(client端)select能正常显示是因为 client端设置的字符集和数据库B的字符集一致
    这样推断是否正确?请lz再核实一下吧
      

  11.   

    我说过,client端与server端是不一样的
    算了,这个问题可能搞不定了