`

存储过程使用dblink问题

 
阅读更多
按照接口标准创建DBlink后. 准备创建物化视图:

CREATE MATERIALIZED VIEW SUBSCRIPTION_TAB
BUILD IMMEDIATE
REFRESH complete START WITH SYSDATE NEXT trunc(SYSDATE) + 1
AS SELECT * FROM SUBSCRIPTION_TAB@SMGR;
不料想,执行之后语句报告错误:
SQL> CREATE MATERIALIZED VIEW SUBSCRIPTION_TAB
2 BUILD IMMEDIATE
3 REFRESH complete START WITH SYSDATE NEXT trunc(SYSDATE) + 1
4 AS SELECT * FROM SUBSCRIPTION_TAB@SMGR;
AS SELECT * FROM SUBSCRIPTION_TAB@SMGR
*
ERROR at line 4:
ORA-00942: table or view does not exist
SQL>desc SUBSCRIPTION_TAB@SMGR

发现输出正常.

检查远程接口对象(SUBSCRIPTION_TAB)属性:为正常的数据表.
发现该表无主键,但是和ORA-00942错误无关.
暂且不表.

查找Metalink .这种问题找这个最快了
搜索出来一堆的帖子,归纳一下可能的原因:
1 远程对象为同义词,而对应的表无mv log
2 global_name 的问题
3 Bug.
4 MLOG$_ 的问题.要重新创建MV log
...
n others

快刀斩乱麻加上猜测,发现以上皆非
此过程花费时间若干,眼睛花了好几回.
还有我们有最后一招:

set events ''942 trace name errorstack level 10''
设定跟踪,
SQL> alter session set max_dump_file_size = unlimited;
Session altered.
SQL> alter session set events ''10046 trace name context forever, level 12'';
Session altered.
SQL> alter session set events ''942 trace name errorstack level 10'';
Session altered.
SQL> CREATE MATERIALIZED VIEW SUBSCRIPTION_TAB
2 BUILD IMMEDIATE
3 REFRESH complete START WITH SYSDATE NEXT trunc(SYSDATE) + 1

4 AS SELECT * FROM SUBSCRIPTION_TAB@SMGR;
AS SELECT * FROM SUBSCRIPTION_TAB@SMGR
*
ERROR at line 4:
ORA-00942: table or view does not exist
...................
此过程如果执行中如果提示用户无权限,需要作适当的授权
然后找到我们的Trace 文件:

[oracle@stat udump]$ ls -ltr
......
-rw------- 1 oracle oracle 1425501 May 13 18:23 stat_ora_1512.trc
-rw------- 1 oracle oracle 1518962 May 13 18:26 stat_ora_1595.trc
-rw------- 1 oracle oracle 1519241 May 13 18:27 stat_ora_1689.trc
-rw------- 1 oracle oracle 1486910 May 13 18:31 stat_ora_1700.trc
-rw-rw---- 1 oracle oracle 1677 May 14 14:49 stat_ora_1046.trc
-rw-rw---- 1 oracle oracle 631 May 15 19:35 stat_ora_14864.trc
-rw-rw---- 1 oracle oracle 631 May 15 19:42 stat_ora_15187.trc
-rw-rw---- 1 oracle oracle 631 May 15 20:57 stat_ora_18540.trc
-rw------- 1 oracle oracle 943813 May 15 21:41 stat_ora_20358.trc //This one!

打开该文件,看了半天,没看太明白.乱糟糟的一大堆内容,头疼.还是格式化一下再看:

[oracle@stat udump]$ tkprof stat_ora_20358.trc SNAPSHOT.sql

查看 SNAPSHOT.sql

这回内容还算清晰,发现主要相关内容如下:
The following statements encountered a error during parse:
SELECT * FROM "witsdba"."SUBSCRIPTION_TAB"@SMGR.US.ORACLE.COM
Error encountered: ORA-00942
--------------------------------------------------------------------------------

SELECT "witsdba"."SUBSCRIPTION_TAB".CURRVAL@SMGR.US.ORACLE.COM FROM
DUAL@SMGR.US.ORACLE.COM
Error encountered: ORA-02289
--------------------------------------------------------------------------------
SELECT * FROM "PUBLIC"."SUBSCRIPTION_TAB"@SMGR.US.ORACLE.COM
Error encountered: ORA-00942
--------------------------------------------------------------------------------
SELECT "PUBLIC"."SUBSCRIPTION_TAB".CURRVAL@SMGR.US.ORACLE.COM FROM
DUAL@SMGR.US.ORACLE.COM
Error encountered: ORA-02289
--------------------------------------------------------------------------------
CREATE MATERIALIZED VIEW SUBSCRIPTION_TAB
BUILD IMMEDIATE
REFRESH complete START WITH SYSDATE NEXT trunc(SYSDATE) + 1
AS SELECT * FROM SUBSCRIPTION_TAB@SMGR
--------------------------
[oracle@stat udump]$ tkprof stat_ora_20358.trc SNAPSHOT.sql
SELECT * FROM "witsdba"."SUBSCRIPTION_TAB"@SMGR.US.ORACLE.COM
...
先从这句下手,从sqlplus 命令中输入,查询看看:

SQL> SELECT * FROM "witsdba"."SUBSCRIPTION_TAB"@SMGR.US.ORACLE.COM
2 /
SELECT * FROM "witsdba"."SUBSCRIPTION_TAB"@SMGR.US.ORACLE.COM
*
ERROR at line 1:
ORA-00942: table or view does not exist
ORA-02063: preceding line from SMGR
...
Faint ,不太可能阿.

刚才desc SUBSCRIPTION_TAB@SMGR 不是还好好的么?
莫非是,莫非是witsdba导的鬼?
SQL> c/witsdba/WITSDBA
查询,居然OK.
抽取dblink SMGR 的ddl :
CREATE DATABASE LINK SMGR CONNECT TO "witsdba" IDENTIFIED BY "mypasswd" USING
''smgr'';
...
"witsdba" ??!!
删掉,重新创建.
CREATE DATABASE LINK SMGR CONNECT TO WITSDBA IDENTIFIED BY "mypasswd" USING
''smgr''
/
...
执行SQL,创建物化试图.一切正常。

打扫战场,做个总结

以上涉及到具体的表名字因为设计到安全问题均已经作了适当的处理。
整个过程比较关键的还是alter session set events ''942 trace name errorstack level 10'' 这一步

很多时候,如果DBA在Metalink上提交一个Tar的话。Oracle技术支持人员会要求用户按照一定操作提交Trace文件。
出于其他的原因(开始还以为是个Bug),只好自己动手了。而且,瞎猫碰上了死耗子,碰巧解决了问题。
分享到:
评论

相关推荐

    oracle 存储过程 函数 dblink

    本文主要介绍了Oracle存储过程的概念、创建和调用方法,以及如何使用DBLink实现跨库操作。存储过程提供了强大的数据库处理能力,而DBLink则使得不同数据库实例之间的交互变得更加方便和高效。掌握这些技术对于提高...

    oracle使用dblink高速复制表数据的动态存储过程

    执行存储过程,通过指定目标数据库登录信息,动态生成dblink,打开游标,按批次插入本地指定表中,每批次1万条数据。同步记录和日志信息写在自动生成的sync_log表中。同步完成后自动删除动态生成的存储过程、dblink...

    Oracle报存储过程中调用DBLink同义词出现错误:PLS-00201: 必须声明标识符

    在Oracle数据库环境中,当我们在存储过程中使用DBLink同义词时,可能会遇到“PLS-00201: 必须声明标识符”的错误。这个错误通常表明编译器无法识别你引用的对象,可能是由于权限问题或者对象定义未正确导入。下面...

    记一次oracle通过dblink连接mysql实施

    本文记录了一次在Oracle 10g 64位环境中,通过DBLink连接到MySQL 5.5的过程,并在面临RAC环境中的问题时找到了解决方案。 首先,Oracle 10g 64位版本的HSODBC(异构服务)可能出现问题,表现为HSODBC文件大小为0,...

    oracle dblink 创建过程

    #### 二、DBLink使用示例 创建DBLink后,可以通过以下方式使用它: 1. **通过DBLink查询数据** 可以使用`@dblink`语法来查询远程数据库中的表: ```sql SELECT * FROM bctl@creditdb; ``` 2. **创建同义词*...

    dblink创建与数据同步

    该存储过程实现源数据库按照时间同步更新计算库的过程 实现表的同步以及动态表某期间的数据同步。 该存储过程主要演示了: 1.dblink创建和dblink的使用; 2.如何使用字典表和游标实现选择性数据同步。

    DBLINk

    静态DBLINK一旦创建,就会作为数据库对象存储在源数据库中,供后续查询和操作使用。 2. **动态DBLINK**:这种类型的DBLINK是在运行时动态创建的,主要用于那些事先未知或不固定的远程数据库链接场景。动态DBLINK...

    oracle使用dblink的例子

    ### Oracle使用DBLink比较两个数据库表的行数一致性 #### DBLink简介 DBLink(Database Link)是Oracle数据库提供的一种连接不同数据库实例的功能。通过DBLink,用户可以在一个数据库环境中查询、更新另一个数据库...

    oracle通过dblink链接 mysql和mssql例子

    通过DBLink,用户可以查询远程数据库中的表,并执行远程数据库上的存储过程。但需要注意的是,DBLink通常是单向的连接。 创建DBLink之前,必须保证以下几点: 1. 本地数据库到远程数据库之间的网络连接正常,可以...

    dblink使用

    3. 提高数据的一致性:DBLink 可以确保数据的一致性,避免数据不一致的问题。 创建 DBLink 创建 DBLink 需要知道待读取数据库的 IP 地址、SSID 以及数据库用户名和密码。创建 DBLink 有两种方式: 1. 已经配置...

    mySQL存储过程调用

    在示例代码中,使用`mysql_query()`执行`SELECT`语句来获取存储过程设置的变量`@a`的值,并通过`mysql_fetch_row()`函数来提取查询结果。 ```php $res = mysql_query("select @a", $dblink); $row = mysql_fetch_...

    Oracle使用dblink导用户下的所有表数据(以迁移scott用户为例)

    Oracle数据库是一种广泛应用于企业级数据存储和管理的系统,它提供了强大的数据迁移工具,其中之一就是DB Link(数据库链接)。在本教程中,我们将探讨如何利用DB Link来迁移Oracle数据库中的用户下所有表的数据,以...

    Oracle利用job和dblink高级数据库同步技术

    2. 编写存储过程:如`MYPROC.prc`,在这个过程中,使用DBLink查询远程数据库的更新,然后在本地执行相应的更新操作。 3. 创建Job:使用`DBMS_SCHEDULER`包中的函数,设定Job的执行时间和频率,指定执行的PL/SQL块或...

    oracle DBLink

    在《Oracle与MSSql对接通讯配置_20100906.docx》文档中,可能详细介绍了如何配置Oracle DBLink与MSSQL Server之间的通信,包括设置网络配置、数据库用户权限、DBLink创建过程以及可能遇到的问题和解决策略。...

    dblink+同义词

    同义词可以指向表、视图、存储过程、函数等数据库对象,提供了一种更灵活的方式来引用这些对象。在多用户环境中,同义词还能够起到安全控制的作用,通过授予用户对同义词的权限而非直接对底层对象的权限,可以限制...

    DBLink_mssql&oracle;

    如果执行存储过程或触发器时出现“该伙伴事务管理器已经禁止了它对远程/网络事务的支持”的错误,需要修改本地DTC的设置: 1. 控制面板 -> 系统和安全 -> 管理工具 -> 组件服务。 2. 定位到“本地DTC”并右键选择...

    PostgreSQL中使用dblink实现跨库查询的方法

    因此,可能需要将查询封装在一个存储过程或函数中,然后在视图中调用该过程或函数。 总的来说,PostgreSQL的dblink扩展为跨库查询提供了强大的支持,它允许你在多个数据库间自由地传输数据和执行复杂操作。正确理解...

    ODI中过程的使用

    这个文档主要介绍了如何在ODI中使用过程,特别是如何通过源表标志位删除目标表数据以及调用数据库存储过程。 1. **编写目的** ODI过程的使用旨在增强数据集成能力,特别是在没有适合的知识模块可用时。通过过程,...

    Oracle通过DBlink连接MySQL

    在实际操作中,务必注意字符集的匹配,避免因字符集不一致导致的数据乱码问题。此外,安全也是重要的考虑因素,确保敏感信息如用户名和密码的安全存储。在整个配置过程中,每一步都需要仔细检查和测试,确保每个环节...

    SQL Server2005 DBLINK链接Oracle 9i详解

    3. **执行存储过程**: ```sql SELECT * FROM OPENQUERY([链接服务器名], 'EXEC [Oracle用户名].[存储过程名]'); ``` 示例: ```sql SELECT * FROM OPENQUERY(TEST2, 'EXEC IFSAPP.PROC_NAME'); ``` #### ...

Global site tag (gtag.js) - Google Analytics