快速解决"Oracle"数据库中的常见问题

  • 来源: 赛迪网 作者: 若水   2008-04-24/15:51
  • 问题1:假如发现表中有坏块,怎样检索其它未坏的数据

    答:首先需要找到坏块的ID(可以运行dbverify实现),假设为1234。运行下面的查询查找段名:

    select segment_name, segment_type, block_id, blocks 
    
    from dba_extents 
    
    where (1234 between block_id and (block_id + blocks - 1));

    一旦找到坏段名称,若段是一个表,则最好建立一个临时表,存放好的数据。若段是索引,则删除它,再重建。

    create table good_table 
    
    as 
    
    select ? from bad_table where rowid not in 
    
    ( select /?+index(bad_table, any_index)?/ rowid 
    
    from bad_table where substr( rowid, 1, 8 ) = 1234)

    问题2:如何关闭FORM调用REPORT时的小窗口?

    答:在利用Oracle数据库的Develop 2000设计开发界面的过程中,当FORM调用REPORT时,会显示一个背景窗口REPORT BACKGROUD ENGINE,等待FORM对REPORT的调用,当FORM调用其它REPORT时,也使用这个后台服务器,不论调用多少个REPORT,这个后台服务器存在且只有一个。但当FORM与REPORT全部退出后,该窗口仍处于等待状态,不会关闭,这时,我们需要手工将其关闭。

    我们可以使用以下参数在FORM调用REPORT时不显示这个小窗口:

    Add_Parameter( pl_id, 
    'ORACLE_SHUTDOWN',TEXT_Parameter, 'Yes' );

    需要注意的是,该参数必须加在所有参数的前面,即它必须为第一个参数。

    ◆问题3:如何根据查询条件在REPORT中动态显示记录?

    答:1. 在REPORT的“数据模型”下面的“用户参数”中,创建用户自定义参数W_CLAUSE,W_CLAUSE为从FORM传递过来的查询条件,数据类型为字符型,缺省值为NULL。

    2. 修改查询Q_1,将SQL查询语句修改为select ? from dept &&w_clause。

    3. 在运行报表时,报表会自动将符合&&w_clause的查询条件记录显示出来。

    如果从FORM传递过来的w_clause为where dept=1,本报表的SQL查询自动转换为select ? from dept where dept=1,并在报表运行#p#分页标题#e#结果中显示符合该查询条件的记录,如果从FORM传递过来的w_cluase为where to_char(年度,'YYYY.MM')='2000.03',则在报表运行结果中自动显示2000年3月份的记录。

    ◆问题4:在Oracle数据库中,如何查看某表上的约束?

    答:我们可以使用下面语句从all_constraints视图中查看某表上的约束:

    SELECT constraint_name, table_name, r_owner, r_constraint_name 
    
    FROM all_constraints 
    
    WHERE table_name = 'table_name' and owner = 'owner_name';

    另一个视图ALL_CONS_COLUMNS也包括组成表上约束列的信息。

    在阅读本文前,大家首先需要了解一下SCN(系统改变号),它的英文全拼为:System Change Number ,它是数据库中非常重要的一个数据结构。

    SCN提供了Oracle的内部时钟机制,可被看作逻辑时钟,这对于恢复操作是至关重要的。

    注释:Oracle 仅根据 SCN 执行恢复。

    它定义了数据库在某个确切时刻提交的版本。在事物提交时,它被赋予一个唯一的标示事物的SCN 。一些人认为 SCN 是指, System Commit Number ,而通常 SCN 在提交时才变化,所以很多情况下,这两个名词经常被交替使用。

    究竟是哪个词其实对我们来说并不是最重要的,重要的是我们知道 SCN 是 Oracle 内部的时钟机制, Oracle 通过 SCN 来维护数据库的一致性,并通过SCN 实施 Oracle 至关重要的恢复机制。

    下面我们来介绍一下获得当前SCN的几种有效方式:

    一.在Oracle9i中,可以使用dbms_flashback.get_system_change_number来获得

    示例:

    SQL> select dbms_flashback.get_system_change_number from dual;
    
    GET_SYSTEM_CHANGE_NUMBER
    ------------------------
    2982184

    二.在Oracle9i之前你可以通过查询x$ktuxe来获得

    X$KTUXE---[K]ernel [T]ransaction [U]ndo Transa[x]tion [E]ntry (table) 
    
    
    SQL> select max(ktuxescnw*power(2,32)+ktuxescnb) from x$ktuxe;
    
    MAX(KTUXESCNW*POWER(2,32)+KTUXESCNB)
    ---------------------
    2980613
    #p#分页标题#e#


    评论 {{userinfo.comments}}

    {{money}}

    {{question.question}}

    A {{question.A}}
    B {{question.B}}
    C {{question.C}}
    D {{question.D}}
    提交

    驱动号 更多