• sqlplus的非交互式使用


    1 sqlplus交互界面存在的问题

    sqlplus是ORACLE数据库的最重要的官方命令行client软件。是DBA的必备工具,使用它能够完毕差点儿所有的管理任务。然而。sqlplus的交互界面并非很友好,输入命令时不具有历史命令记录功能。默认的输出结果更是不堪入目。

    在易用性方面,sqlplus确实比mysqlclient差了不少。

    既然sqlplus交互模式存在这么多的不便。那么不如干脆直接使用非交互模式使用它,再借助操作系统提供的shell工具集来协助完毕更复杂的任务。sqlplus本身就是支持非交互式使用的,并且支持的很好,符合一般的Unix设计哲学:从标准输入读取命令。把结果写到标准输出

    2 sqlplus的两种非交互式使用方式

    sqlplus在非交互模式下,能够从两个地方为其提供sql命令:一是通过外部文件,而是通过标准输入。

    2.1 通过外部命令文件

    sqlplus username/password@serverIP/侦听服务名 @命令文件名称
    

    以下举一个样例。
    命令文件名称为 1.sql。内容例如以下:

    select count(*) from dba_objects;
    exit;

    运行命令为:

    sqlplus sys/***@172.16.2.190/xgdb.db001.xigang @1.sql
    

    此时运行完毕会把结果输出。
    这样的外部命令文件的方式。须要建立单独的物理文件来存储命令。适合常常使用的大批量管理任务。

    2.2 通过标准输入

    既然sqlplus从标准输入来读取命令,那么就能够利用管道把命令发送给它。

    echo 命令 | sqlplus username/password@serverIP/侦听服务名
    

    这样的方式不须要在命令中包括 exit;,因为sqlplus运行后自己主动退出。以下是个样例:

    echo 'select count(*) from dba_objects;' | sqlplus sys/***@172.16.2.190/xgdb.db001.xigang as sysdba
    

    这样运行后结果输出到屏幕。因为sql语句是bash命令的參数。而整个命令行能够通过bash方便的历史记录来反复调用。又能够方便的使用上下箭头来反复使用运行过的sql语句了。

    3 利用管道做兴许处理

    既然sqlplus把结果输出到了标准输出,那么就能够借助管道,使用sed,awk等文字处理工具来得到想要的输出。

    echo -e 'set pagesize 0
    select table_name,owner from dba_tables;' | sqlplus -S sys/***@172.16.2.190/xgdb.db001.xigang as sysdba | awk '{printf("%-10d%-30s%-20s
    ",NR,$1,$2);}'
    

    4 须要注意的地方

    使用外部文件时,文件里的命令与交互式使用全然同样,无需操心。

    • 使用echo + 管道输入时,要避免 bash 元字符的干扰。一定要把sql命令使用单引號或双引號保护起来。

      当sql命令中有单引號时。应选择使用双引號保护。如

      echo  "insert into t1(name) values('奥巴马');" | sqlplus ...
      
    • 因为$在双引號里也会被当成元字符。所以须要对其进行转义

      echo "select * from v$nls_valid_values where parameter='LANGUAGE';" | sqlplus ...
      
    • 另外,sqlplus不同意把sqlplus指令和sql命令混合在一行使用。

      并且sql命令必须以;结尾。这样必须使用echo -e 选项来开启把” ”解释成换行符。

      比如

      echo -e 'set pagesize 0
      set linesize 100
      select * from dba_objects;' | sqlplus ...
      

    5 一个简单的脚本

    上述命令行方式尽管能够方便的通过bash的历史记录功能调用运行过的sql语句,可是命令行中除了sql语句还有大量的其它内容,显得繁琐。所以。写一个小脚本(文件名称为sql)会让调用起来很方便,例如以下:

    #!/bin/bash -
    if [ $# -ne 1 ]
    then
        echo "Usage: $0 'SQL statement'"
    else
        SQL="set pagesize 0
    set linesize 300
    $1"
        echo -e "$SQL"
        echo -e "$SQL" | sqlplus -S sys/***@172.16.2.190/xgdb.db001.xigang as sysdba
    fi
    

    这样调用起来就像以下一样。

    sql 'select * from dba_objects;'
    

    这样显得很干净利落。并且也不会在历史命令中记下ORACLE的账户信息,相对也安全。

  • 相关阅读:
    Framework 4.0 新关键字dynamic 之我见(二)
    随便歇歇
    最近的一些总结
    一周最新示例代码回顾 (7/16 7/22)
    一周最新示例代码回顾 (5/28–6/3)
    一周最新示例代码回顾 (5/14–5/20)
    一周最新示例代码回顾 (6/25 7/1)
    微软一站式示例代码浏览器本周更新发布
    一周最新示例代码回顾 (6/11 6/17)
    示例代码浏览器5.4功能更新
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5367748.html
Copyright © 2020-2023  润新知