您现在的位置是:首页 >

场地调查常见问题答疑 Oracle数据库常见问题答疑二

火烧 2021-12-30 14:13:47 1043
Oracle数据库常见问题答疑二    问 利用QUERY选项输出数据    我知道在Oracle i中 可以使用QUERY有选择地输出表数据 我想用EXP命令来实现 但没有成功 下面是我所写的命令

Oracle数据库常见问题答疑二  

场地调查常见问题答疑 Oracle数据库常见问题答疑二
   问 利用QUERY选项输出数据    我知道在Oracle i中 可以使用QUERY有选择地输出表数据 我想用EXP命令来实现 但没有成功 下面是我所写的命令 以及得到的错误信息     exp ddd/ddd file=/dbf/u /customer dmp    tables=AASC AST_CUSTOMER_KEEP    query= where CUA_TRANS_DTS <    add_months(sysdate )     table_export[ ]: CUA_TRANS_DTS: not found (没有找到)    答 操作系统不同 用来指定QUERY=参数的方法也不同 WHERE 语句里面往往有很多特殊的字符 如= > <和空格等等 而UNIX和Windows操作系统中的外壳命令提示是不欢迎这些字符的 这些字符将被忽略 你应该根据不同的操作系统采用不用的方法 我一般使用带有QUERY选项的参数文件(PARFILE) 利用PARFILE 可以不考虑操作系统平台而使用完全相同的方法     下面给出一个例子 我用select * from all_objects建立了一个表T 我希望输出所有object_id 小于 的行 在Windows中 必须这样做     C:exp>exp userid=tkyte/tkyte tables=t    query= where object_id <     注意 在windows中 需要在WHERE语句的两端使用三个双引号 在UNIX中 必须这样做     $ exp userid=/ tables=t query= where    object_id <     exp userid=/ tables=t parfile=exp par    如果使用包含query= where object_id < 的PARFILE文件 我可以在两个系统中使用相同的一个命令     exp userid=/ tables=t parfile=exp par    在两种操作系统中 完全相同 这相对于在不同的平台中使用不同的QUERY字符串容易多了      问 DBMS_RANDOM    您能否告诉我写一个能产生大于 小于 的随机数的随机数产生器的最好方法?    答 Oracle 版介绍了DBMS_RANDOM包 Oracle i 版介绍了DBMS_RANDOM包的新功能 但Oracle i 文档中没有详细全面介绍其功能 幸运的是 有一个新的DBMS_RANDOM包函数能够返回 之间的随机数 这个新函数是     FUNCTION value RETURN NUMBER;    FUNCTION value (low IN NUMBER high IN    NUMBER) RETURN NUMBER;    FUNCTION normal RETURN NUMBER;    FUNCTION string (opt char len NUMBER)    RETURN VARCHAR ;    VALUE函数的第一种形式返回一个大于或等于 且小于 的随机数 第二种形式返回一个大于或等于LOW 小于HIGH的随机数 下面是其用法的一个示例     SQL> select dbms_random value     dbms_random value( )     from dual;    VALUE DBMS_RANDOM VALUE( )              NORMAL函数返回服从正态分布的一组数 此正态分布标准偏差为 期望值为 这个函数返回的数值中有 %是介于 与+ 之间 %介于 与+ 之间 %介于 与+ 之间 事实上 这就是你在清单 中所看到的     最后 是STRING函数 它返回一个长度达 个字符的随机字符串 参数OPT可以是清单 显示的值中的任何一个单个字符     关于这些函数及DBMS_RANDOM包的文件都包含在SQLPlus中     select text    from all_source    where name = DBMS_RANDOM     and type = PACKAGE order by line;     问 连接次序与谓词求值    在下面的查询中 WHERE 语句的哪一部分先执行?    Select field names from emp dept    w    here emp dept_num = dept num and    emp name Like S% and dept name= IT ;    答 执行次序随已有的索引 统计 和session/init ora参数的不同而变化     假定已有一个建立在DEPT(name)和EMP(dept_num)上的索引 假定优化器认为DEPT是唯一的 它可能按下面的顺序进行操作     利用建立在DEPT(name)上的索引查找dept列    利用建立在EMP(dept_num)上的索引查找匹配的emp列(即连接emp dept_num = dept num)    依据建立在emp ename like S% 进行过滤    现在 我们假定没有建立在EMP(dept_num)上的索引 也没有建立在DEPT(name)上的索引 而存在建立在EMP(name)和DEPT(num)上的索引 优化器可能按下面的次序进行操作     利用建立在EMP(name)上的索引找到带有S的EMPS    利用建立在DEPT(num)上的索引找到匹配项    根据dept name = IT 过滤结果    谓词求值的次序是不确定的 可以随时间的改变而改变 并由优化器决定 不要假定任何事情会按一定的次序发生 如果你那么做 随着时间的推移 你的应用程序可能会出现一些看起来非常奇怪的错误 看以下的例子 建立一个表 输入一些数据 当X= a 时 第二列的数据 Y 是一个数值 当X= b 时 Y 不是数字     SQL> create table t ( x varchar ( ) y varchar ( ) );    Table created     SQL> insert into t values ( a );     row created     SQL> insert into t values ( b x );     row created     现在根据这个表运行一个查询 查找满足x= a y= 的行     SQL> select * from t where x = a and    y = ;    ERROR:    ORA : invalid number    no rows selected(错误 无效的数字 没有选择任何行)    呦 没有成功 在这种情况下 数据库首先执行Y= 当找到Y= X 的行后 很显然 它不能将 X 转换为一个数字 所以失败了 而下面的程序将给出不同的结果     SQL> analyze table t pute statistics;    Table analyzed (表已经分析过)    SQL> select * from t where x = a and    y = ;    X Y         a     使用不同的优化器模式 成功了!为什么?优化器说 嘿 检查x= a 要比检查y= 来得快 因为在y= 中有一个将y从字符变为数字的转换 所以 我先检查x= a 然后再检查y=     这个例子说明谓词执行的次序可能是不确定的 你不能指望有一种特定的执行次序 也就是说 当你依靠一个隐含的转换时 必须非常谨慎      问 显示SGA fixed size(固定大小)与variable size(可变大小)    当在svrmgr提示符下运行 show SGA 时 fixed size和variable size是什么意思?    答 fixed size就是SGA中固定组件(它在编译oracle 数据库本身时就固定于其中)的大小 它是固定大小的内存 用来指向SGA的其它部分 SGA这一部分的大小是不能改变的     variable size指分配的内存块大小可变 SGA的可变块 分为共享池 大池 JAVA池 游标区和其他结构 lishixinzhi/Article/program/Oracle/201311/17509  
永远跟党走
  • 如果你觉得本站很棒,可以通过扫码支付打赏哦!

    • 微信收款码
    • 支付宝收款码