• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

sqlcli: Python SQL Test tool

原作者: [db:作者] 来自: 网络 收藏 邀请

SQLCli 快速说明

SQLCli 是一个主要用Python完成的,命令快速的测试工具。
设计目的:
1: 满足数据库方面的相关功能测试、压力测试需要。
2: 能够作为一个日常小工具,进行数据库的日常操作。
3: 能够根据需要快速、灵活的生成测试需要的随机数据。
4: 能够操作Kafka消息队列。
5: 能够操作HDFS上的文件。
6: 完成基于执行结果比对的回归测试校验。

程序可以通过JPype连接数据库的JDBC驱动。
也可以通过ODBC标准连接数据库的ODBC驱动,但是这部分并没有经过严谨的测试。

SQLCli 目前可以支持的数据库有:

  • Oracle,MySQL,PostgreSQL,SQLServer,TeraData, Hive, H2等主流通用数据库
  • 达梦,神通, 金仓, 南大通用,LinkoopDB, 快立方等众多国产数据库
  • ClickHouse数据库
  • 其他符合标准JDBC规范的数据库

SQLCli 目前支持的数据类型有:

    CHAR                                  ====>     str    VARCHAR                               ====>     str    LONGVARCHAR                           ====>     str    TIMESTAMP_WITH_TIMEZONE               ====>     datetime.datetime    TIMESTAMP                             ====>     datetime.datetime    TIME                                  ====>     datetime.time    DATE                                  ====>     datetime.date    BINARY                                ====>     bytearray      VARBINARY                             ====>     bytearray    LONGVARBINARY                         ====>     bytearray    DECIMAL                               ====>     decimal.Decimal      NUMERIC                               ====>     decimal.Decimal    DOUBLE                                ====>     decimal.Decimal    REAL                                  ====>     decimal.Decimal    FLOAT                                 ====>     float    TINYINT                               ====>     int    INTEGER                               ====>     int    SMALLINT                              ====>     int      INTEGER                               ====>     int    BOOLEAN                               ====>     bool    BFILE                                 ====>     str "bfilename(dirpath:filename)"    BIGINT                                ====>     decimal.Decimal    BIT                                   ====>     decimal.Decimal    STRUCT                                ====>     tuple()    ARRAY                                 ====>     list()    CLOB                                  ====>     SQLCliLargeObject.getData() ==> str    BLOB                                  ====>     SQLCliLargeObject.getData() ==> bytearray

谁需要使用这个工具

需要通过SQL语句来查看、维护数据库的。
需要进行各种数据库功能测试、压力测试的。
需要用统一的方式来连接各种不同数据库的。

为什么要设计这个工具

这个工具的存在目的不是为了替代各种数据库的命令行工具,如Oracle的SQLPlus,MYSQL的mysql等
这个工具的存在目的是在尽可能地兼容这些命令行工具的同时提供测试工作需要的相关特性。
这些特性包括:
1:并发脚本的支持,通过在脚本中使用JOBManager,可以同时执行多个脚本,同时利用时间戳还可以同步脚本之前的行为。
2:一些internal的命令,可以完成数据库之外的相关操作。


安装

安装的前提有:

  • 有一个Python 3.6以上的环境

  • 能够连接到互联网上, 便于下载必要的包

  • 安装JDK8

  • 对于Windows平台,需要提前安装微软的C++编译器(jpype1使用了JNI技术,需要动态编译)

  • 对于Linux平台, 需要提前安装gcc编译器,unixODBC开发环境,以及Python3的开发包(原因同上)
    yum install -y gcc-c++ gcc
    yum install -y unixODBC unixODBC-develyum install python3<?>-devel(在Anaconda环境下,这一步不是必须的. ?是具体的Python版本,根据自己的环境决定)

  • 对于MAC平台, 需要提前安装gcc编译器,以及unixODBC开发环境
    brew install gcc
    brew install unixODBC

依赖的第三方安装包:

  • 这些安装包会在robotslacker-sqlcli安装的时候自动随带安装
  • setproctitle : Python通过setproctitle来设置进程名称,从而在多进程并发时候给调试人员以帮助
  • click : Python的命令行参数处理
  • prompt_toolkit : 用于提供包括提示符功能的控制台终端的显示样式
  • hdfs : HDFS类库,支持对HDFS文件操作
  • requests :HTTP客户端请求协议
  • websockets : HTTP客户端请求协议
  • pydantic : FastAPI服务端支持
  • uvicorn[standard] : FastAPI服务端支持
  • fastapi : FastAPI服务端支持其他:对于Linux和MAC,在安装后需要手工加载confluent_kafka来保证kafka操作的正常
  • pip install confluent_kafka

对于Windows,由于confluent_kafka目前不支持Windows,所以无需安装,也不能使用该功能

利用PIP来安装:

   pip install -U robotslacker-sqlcli

安装后步骤-下载驱动程序:

安装后步骤-根据需要修改sqlcli/conf/sqlcli.ini文件:

  • 默认情况下,这个文件不需要修改
  • 如果你需要定义自己内网的驱动程序下载服务器,你需要修改这个文件
  • 如果你需要定义自己的数据库驱动,你需要修改这个文件

第一次使用

安装后直接在命令下执行sqlcli命令即可。
如果你的<PYTHON_HOME>/Scripts没有被添加到当前环境的$PATH中,你可能需要输入全路径名

(base) >sqlcliSQL*Cli Release 0.0.32SQL> 

如果你这里看到了版本信息,那祝贺你,你的程序安装成功了

(base) >sqlcliSQL*Cli Release 0.0.32SQL> connect mem;SQL> Connected.

如果你下载了至少H2的驱动程序,执行这个命令将连接到内置的H2数据库中,如果你看到了Connected信息,那再一次祝贺你,你的程序基本工作正常。


驱动程序的下载和配置

sqlcli是一个基于JDBC/ODBC的数据库工具,基于JDBC操作数据库的前提当前环境下有对应的数据库连接jar包,基于ODBC前提是安装了相关的ODBC驱动。

驱动程序的配置

配置文件位于SQLCli的安装目录下的conf目录中,配置文件名为:sqlcli.conf
配置例子:

[driver]oracle=oracle_drivermysql=mysql_driver.... [oracle_driver]filename=ojdbc8.jardownloadurl=http://xxxxxx/driver/ojdbc8.jarmd5=1aa96cecf04433bc929fca57e417fd06driver=oracle.jdbc.driver.OracleDriverjdbcurl=jdbc:oracle:thin:@${host}:${port}/${service}[mysql_driver]filename=mysql-connector-java-8.0.20.jardownloadurl=http://xxxxx/driver/mysql-connector-java-8.0.20.jarmd5=48d69b9a82cbe275af9e45cb80f6b15fdriver=com.mysql.cj.jdbc.Driverjdbcurl=jdbc:mysql://${host}:${port}/${service}jdbcprop=socket_timeout:360000000odbcurl=DRIVER={driver_name};SERVER=${host};PORT=${port};DATABASE=${service};UID=${username};PWD=${password};

如果数据库要新增其他数据库的连接,则应仿效上述配置例子。
其中:

  • 所有的数据库名称及配置项名称均应该出现在[driver]的配置项中
    如果某一种数据库连接需要不止一个jar包,则这里应该配置多个配置项
    例如: mydb=mydb1_driver1, mydb1_driver2
  • 数据库的具体配置应该在具体的配置项中
    filename: 可选配置项,jar包具体的名字
    driver: 可选配置项,数据库连接的主类
    jdbcurl: 可选配置项,jdbc连接字符串,其中${host}${port}${service}分别表示数据库连接主机,端口,数据库名称
    downloadurl: 可选配置项,若本地不存在该文件,则文件下载需要的路径
    md5: 可选配置项,文件下载校验MD5
    jdbcprop: 可选配置项,若该数据库连接需要相应的额外参数,则在此处配置odbcurl: 可选配置项,若该数据库连需要通过ODBC连接数据库,则在此处配置
    jdbcurl和odbcurl两个参数,至少要配置一个。若配置jdbcurl,则jdbc对应的filename,driver也需要配置
  • 基于这个原则,最简化的运行配置应该为:
[driver]oracle=oracle_drivermysql=mysql_driver[oracle_driver]filename=ojdbc8.jardriver=oracle.jdbc.driver.OracleDriverjdbcurl=jdbc:oracle:thin:@${host}:${port}/${service}[mysql_driver]filename=mysql-connector-java-8.0.20.jardriver=com.mysql.cj.jdbc.Driverjdbcurl=jdbc:mysql://${host}:${port}/${service}

驱动程序的下载

基于上述参数文件的正确配置,可以使用--syncdriver的方式从服务器上来更新数据库连接需要的jar包
例子:

(base) C:\Work\linkoop\sqlcli>sqlcli --syncdriverChecking driver [oracle] ...File=[ojdbc8.jar], MD5=[1aa96cecf04433bc929fca57e417fd06]Driver [oracle_driver] is up-to-date.Checking driver [mysql] ...File=[mysql-connector-java-8.0.20.jar], MD5=[48d69b9a82cbe275af9e45cb80f6b15f]Driver [mysql_driver] is up-to-date.

程序的命令行参数

(base) sqlcli --helpUsage: sqlcli [OPTIONS]Options:  --version       Output sqlcli's version.  --logon TEXT    logon user name and password. user/pass  --logfile TEXT  Log every query and its results to a file.  --execute TEXT  Execute SQL script.  --nologo        Execute with silent mode.  --sqlperf TEXT  SQL performance Log.  --syncdriver    Download jdbc jar from file server.  --clientcharset TEXT  Set client charset. Default is UTF-8.  --resultcharset TEXT  Set result charset. Default is same to clientcharset.  --help          Show this message and exit.

--version 用来显示当前工具的版本号

(base) sqlcli --versionVersion: 0.0.32

--logon 用来输入连接数据的的用户名和口令

(base) sqlcli --logon user/passVersion: 0.0.32Driver loaded.Database connected.SQL>如果用户、口令正确,且相关环境配置正常,你应该看到如上信息。user/pass : 数据库连接的用户名和口令  成功执行这个命令的前提是你已经在环境变量中设置了数据库连接的必要信息。  这里的必要信息包括:环境变量:  SQLCLI_CONNECTION_URL  参数格式:  jdbc:[数据库类型]:[数据库通讯协议]://[数据库主机地址]:[数据库端口号]/[数据库服务名]  

--logfile 用来记录本次命令行操作的所有过程信息
这里的操作过程信息包含你随后在命令行里头的所有输出信息。
如果你在随后的命令行里头设置了SET ECHO ON,那么记录里头还包括了你所有执行的SQL语句原信息
文件输出的字符集将根据参数resultcharset中的设置来确定

(base) sqlcli --logon user/pass --logfile test.logVersion: 0.0.32Driver loaded.Database connected.set echo onselect * from test_tab;+----+----------+| ID | COL2     |+----+----------+| 1  | XYXYXYXY || 1  | XYXYXYXY |+----+----------+SQL> exitDisconnected.(base) type test.logDriver loaded.Database connected.SQL> select * from test_tab;+----+----------+| ID | COL2     |+----+----------+| 1  | XYXYXYXY || 1  | XYXYXYXY |+----+----------+2 rows selected.SQL> exitDisconnected.

--execute 在SQLCli启动后执行特定的SQL脚本
为了能够批处理一些SQL语句,我们通常将这批SQL语句保存在一个特定的文件中,这个文件的习惯后缀是.sql
通过execute参数,可以让SQLCli来执行这个脚本,而不再需要我们一行一行的在控制台输入
脚本字符集将根据参数clientcharset中的设置来确定

(base) type test.sqlselect * from test_tab;(base) sqlcli --logon user/pass --execute test.sqlVersion: 0.0.32Driver loaded.Database connected.set echo onselect * from test_tab;+----+----------+| ID | COL2     |+----+----------+| 1  | XYXYXYXY || 1  | XYXYXYXY |+----+----------+SQL> exitDisconnected.注意: 即使你的SQL脚本中不包含Exit语句,在sqlcli执行完当前脚本后,他也会自动执行exit语句如果SQL脚本中不包含数据库驱动加载或者数据库连接语句,请在执行这个命令前设置好相应的环境变量信息

--nologo 这是一个选项,用来控制sqlcli是否会在连接的时候显示当前的程序版本

(base) sqlcli SQL*Cli Release 0.0.32SQL>   区别:(base) sqlcli --nologoSQL>

--sqlperf 输出SQL运行日志
这里的运行日志不是指程序的logfile,而是用CSV文件记录的SQL日志,
这些日志将作为后续对SQL运行行为的一种分析
运行日志共包括如下信息:
1、Script 运行的脚本名称
2、StartedTime SQL运行开始时间,格式是:%Y-%m-%d %H:%M:%S
3、elapsed SQL运行的消耗时间,这里的单位是秒,精确两位小数
4、RAWSQL 原始的SQL信息
4、SQL 运行的SQL,注意:这里可能和RAWSQL不同,不同的原因是SQL可能会被重写文件改写
5、SQLStatus SQL运行结果,0表示运行正常结束,1表示运行错误
6、ErrorMessage 错误日志,在SQLStatus为1的时候才有意义
7、Scenario 程序场景名称,这里的内容是通过在SQL文件中指定-- [Hint] Scenario:name的方式来标记的Scenario信息
说明:上述信息都有TAB分隔,其中字符信息用单引号包括,如下是一个例子:

Script  Started elapsed SQLPrefix       SQLStatus       ErrorMessage    Scenariosub_1.sql 2020-05-25 17:46:23       0.00        loaddriver localtest\linkoopdb-jdbc-2.3.      0             Scenario1sub_1.sql 2020-05-25 17:46:23       0.28        connect admin/123456  0             Scenario1sub_1.sql 2020-05-25 17:46:24       0.00        SET ECHO ON   0             Scenario1sub_1.sql 2020-05-25 17:46:24       0.00        SET TIMING ON 0             Scenario2sub_1.sql 2020-05-25 17:46:24       0.01        LOADSQLMAP stresstest 0             Scenario2sub_1.sql 2020-05-25 17:46:24       0.92        ANALYZE TRUNCATE STATISTICS   0             Scenario3sub_1.sql 2020-05-25 17:46:25       0.02        SELECT count(SESSION_ID)  FROM INFORMATI      0             Scenario3sub_1.sql 2020-05-25 17:46:25       1.37        drop user testuser if exists cascade  0             Scenario3sub_1.sql 2020-05-25 17:46:26       0.54        CREATE USER testuser PASSWORD 123456        0             Scenario3

在SQLCli里面查看当前支持的命令

(base) sqlcli SQL*Cli Release 0.0.32SQL> help+--------------+-----------------------------------------------------+| Command      | Description                                         |+--------------+-----------------------------------------------------+| __internal__ | 执行内部操作命令:                                  || __internal__ |     __internal__ hdfs          HDFS文件操作         || __internal__ |     __internal__ kafka         kafka队列操作        || __internal__ |     __internal__ data          随机测试数据管理     || __internal__ |     __internal__ test          测试管理             || __internal__ |     __internal__ job           后台并发测试任务管理 || __internal__ |     __internal__ transaction   后台并发测试事务管理 || connect      | 连接到指定的数据库                                  || disconnect   | 断开数据库连接                                      || echo         | 回显输入到指定的文件                                || exit         | 正常退出当前应用程序                                || help         | Show this help.                                     || host         | 执行操作系统命令                                    || loaddriver   | 加载数据库驱动文件                                  || loadsqlmap   | 加载SQL映射文件                                     || quit         | Quit.                                               || session      | 数据库连接会话管理                                  || set          | 设置运行时选项                                      || sleep        | 程序休眠(单位是秒)                                  || spool        | 将输出打印到指定文件                                || start        | 执行指定的测试脚本                                  |+--------------+-----------------------------------------------------+这里显示的是所有除了标准SQL语句外,可以被执行的各种命令开头。标准的SQL语句并没有在这里显示出来,你可以直接在控制行内或者脚本里头执行SQL脚本。

连接数据库

在sqlcli命令行里头,可以通过connect命令来连接到具体的数据库

(base) sqlcli SQL*Cli Release 0.0.32SQL> connect user/pass@jdbc:[数据库类型]:[数据库通讯协议]://[数据库主机地址]:[数据库端口号]/[数据库服务名] Database connected.SQL> 能够成功执行connect的前提是: 数据库驱动已经放置到jlib下,并且在conf中正确配置如果已经在环境变量中指定了SQLCLI_CONNECTION_URL,连接可以简化为(base) sqlcli SQL*Cli Release 0.0.32SQL> connect user/passDatabase connected.SQL> 在数据库第一次连接后,第二次以及以后的连接可以不再输入连接字符串,程序会默认使用上一次已经使用过的连接字符串信息,比如:(base) sqlcli SQL*Cli Release 0.0.32SQL> connect user/pass@jdbc:[数据库类型]:[数据库通讯协议]://[数据库主机地址]:[数据库端口号]/[数据库服务名] Database connected.SQL> connect user2/pass2Database connected.SQL> 常见数据库的连接方式示例:H2:    connnet memORACLE:    connect username/password@jdbc:oracle:tcp://IP:Port/Service_NameMYSQL:    connect username/password@jdbc:mysql:tcp://IP:Port/Service_NamePostgreSQL:    connect username/password@jdbc:postgresql:tcp://IP:Port/Service_NameSQLServer:    connect username/password@jdbc:sqlserver:tcp://IP:Port/DatabaseNameTeraData:    connect username/password@jdbc:teradata:tcp://IP/DatabaseNameHive:    connect hive/hive@jdbc:hive2://IP:Port/DatabaseNameClickHouse:	connect default/""@jdbc:clickhouse:tcp://IP:Port/DatabaseNameLinkoopDB:    connect username/password@jdbc:linkoopdb:tcp://IP:Port/Service_Name

断开数据库连接

(base) sqlcli SQL*Cli Release 0.0.32SQL> connect user/pass@jdbc:[数据库类型]:[数据库通讯协议]://[数据库主机地址]:[数据库端口号]/[数据库服务名] Database connected.SQL> disconnectDatabase disconnected.

会话的切换和保存

(base) sqlcli SQL*Cli Release 0.0.32SQL> connect user/pass@jdbc:[数据库类型]:[数据库通讯协议]://[数据库主机地址]:[数据库端口号]/[数据库服务名] Database connected.SQL> session save sesssion1Session saved.# 这里会把当前会话信息保存到名字为session1的上下文中,session1为用户自定义的名字# 注意:这里并不会断开程序的Session1连接,当Restore的时候也不会重新连接SQL> connect user/pass@jdbc:[数据库类型]:[数据库通讯协议]://[数据库主机地址]:[数据库端口号]/[数据库服务名]Database connected.# 连接到第一个会话SQL> session save sesssion2Session saved.# 这里会把当前会话信息保存到名字为session2的上下文中,session2为用户自定义的名字# 注意:这里并不会断开程序的Session2连接,当Restore的时候也不会重新连接SQL> session show+---------------+-----------+-----------------------------------------------+| Sesssion Name | User Name | URL                                           |+---------------+-----------+-----------------------------------------------+| session1      | xxxxx     | jdbc:xxxxx:xxx://xxx.xxx.xxx.xxx/xxxx         || session2      | yyyyy     | jdbc:yyyy:xxx://xxx.xxx.xxx.xxx/yyyyy         |         +---------------+-----------+-----------------------------------------------+# 显示当前保存的所有会话信息SQL> session restore sesssion1Session stored.# 这里将恢复当前数据库连接为之前的会话1SQL> session restore sesssion2Session stored.# 这里将恢复当前数据库连接为之前的会话2SQL> session saveurl sesssion3Session saved.# 这里会把当前会话信息的URL保存到名字为session3的上下文中,session3为用户自定义的名字# 注意:这里并不会保持程序的Session3连接,仅仅记录了URL信息,当Restore的时候程序会自动重新连接SQL> session release sesssion3Session released.# 这里将释放之前保存的数据库连接,和针对具体一个连接的DisConnect类似

从脚本中执行SQL语句

我们可以把语句保存在一个SQL文件中,并通过执行SQL文件的方式来执行具体的SQL
语法格式为:

    start [script1.sql] [script2.sql] .... [loop $nlooptime]

例如:

(base) sqlcli SQL*Cli Release 0.0.32SQL> start aa.sqlSQL> ....SQL> disconnect这里将执行aa.sql如果有多个文件,可以依次填写,如SQL> start aa.sql bb.sql ....(base) sqlcli SQL*Cli Release 0.0.32SQL> start aa.sql loop 10SQL> ....SQL> disconnect这里将执行aa.sql共计10次如果有多个文件,可以依次填写,如SQL> start aa.sql bb.sql .... loop 10

让程序休息一会

(base) sqlcli SQL*Cli Release 0.0.32SQL> sleep 10SQL> disconnectDatabase disconnected.这里的10指的是10秒,通过这个命令可以让程序暂停10秒钟。Sleep的做法主要用在一些定期循环反复脚本的执行上

执行主机的操作命令

(base) sqlcli SQL*Cli Release 0.0.32SQL> host date2020年 10月 29日 星期四 11:24:34 CSTSQL> disconnectDatabase disconnected.这里的date是主机的命令,需要注意的是:在Windows和Linux上命令的不同,脚本可能因此无法跨平台执行

回显指定的文件

(base) sqlcli SQL*Cli Release 0.0.32SQL> echo subtest.sql-- 这里是subtest.sqlconnect admin/123456select * from catSQL> echo off这里从echo开始,到echo off结束的中间内容并不会被数据库执行,而且会记录在subtest.sql中同样的操作,这里也可以用来生成一些简单的配置文件,简单的报告信息等

加载数据库驱动

SQLCli会默认加载所有配置在conf/sqlcli.ini中的JDBC驱动

(base) sqlcli SQL*Cli Release 0.0.32SQL> loaddriver;没有任何参数的loaddriver命令将显示出所有系统已经加载的驱动程序SQL> loaddriver [database_name]  [jdbc_jarfile]将用参数中jdbc_jarfile指定的文件替换掉配置文件中的文件信息

加载SQL重写配置文件

在sqlcli命令行里头,可以通过loadsqlmap命令来加载SQL重写配置文件

(base) sqlcli SQL*Cli Release 0.0.31SQL> loadsqlmap map1Mapping file loaded.这里的map1表示一个重写配置文件,这里可以写多个配置文件的名字,比如loadsqlmap map1,map2,map3,多个文件名之间用逗号分隔重写文件的查找顺序:   1.  以map1为例子,如果map1是一个全路径或者基于当前目录的相对目录,则以全路径或相对目录为准。这时候参数应该带有后缀   2:  如果依据全路径没有找到,则会尝试在脚本所在的目录进行相对目录的查找。这时候参数不能够带后缀,查找的后缀文件名是.map   同时存在多个配置的情况下,配置会被叠加启用SQL重写的方法:   1.   在命令行里面,通过sqlcli --sqlmap map1的方式来执行重写文件的位置   2.   定义在系统环境变量SQLCLI_SQLMAPPING中指定。 如果定义了命令行参数,则系统环境变量不生效   3.   通过在SQL输入窗口,输入loadsqlmap的方式来指定重写文件的写法要求:   以下是一个重写文件的典型格式, 1,2,3,4,5 是文件的行号,不是真实内容:    1 #..*:                                          2 ((?i)CREATE TABLE .*\))=>\1 engine xxxxx    3 WEBURL=>{ENV(ROOTURL)}    4 MYID=>{RANDOM('random_ascii_letters_and_digits',10)}    5 #.    行1:        这里定义的是参与匹配的文件名,以#.开头,以:结束,如果需要匹配全部文件,则可以在中间用.*来表示    行2:        这里定义的是一个正则替换规则, 在符合CREATE TABLE的语句后面增加engine xxxxx字样    行3:        这里定义的是一个正则替换规则, 用环境变量ROOTURL的值来替换文件中WEBURL字样    行4:        这里定义的是一个正则替换规则, 用一个最大长度位10,可能包含字母和数字的内容来替换文件中的MYID字样    行5:        文件定义终止符    每一个MAP文件里,可以循环反复多个这样的类似配置,每一个配置段都会生效重写SQL的日志显示:    被重写后的SQL在日志中有明确的标志信息,比如:        SQL> CREATE TABLE T_TEST(           > id int,           > name varchar(30),           > salary int           > );        REWROTED SQL> Your SQL has been changed to:        REWROTED    > CREATE TABLE T_TEST(        REWROTED    > id int,        REWROTED    > name varchar(30),        REWROTED    > salary int        REWROTED    > ) engine xxxx;     这里第一段是SQL文件中的原信息,带有REWROTED的信息是被改写后的信息

执行数据库SQL语句

在数据库连接成功后,我们就可以执行我们需要的SQL语句了,对于不同的SQL语句我们有不同的语法格式要求。

  • 对于SQL语句块的格式要求:
    SQL语句块是指用来创建存储过程、SQL函数等较长的SQL语句
    SQL语句块的判断依据是:
     CREATE | REPLACE ******   FUNCTION|PROCEDURE **** | DECLARE ****     这里并没有完整描述,具体的信息可以从代码文件中查阅

执行SQL语句块

  SQL语句块的结束符为【/】,且【/】必须出现在具体一行语句的开头 比如:

    SQL> CREATE PROCEDURE PROC_TEST()       > BEGIN       >     bulabulabula....;       > END;       > /    SQL> 

  对于SQL语句块,SQLCli将被等待语句结束符后把全部的SQL一起送给SQL引擎(不包括语句结束符)。

  • 对于多行SQL语句的格式要求:
    多行SQL语句是指不能在一行内写完,需要分成多行来写的SQL语句。
    多行SQL语句的判断依据是: 语句用如下内容作为关键字开头
    CREATE | SELECT | UPDATE | DELETE | INSERT | __INTERNAL__ | DROP | REPLACE | ALTER

执行多行SQL语句

  多行SQL结束符为分号【 ;】 比如:

    SQL> CREATE TABLE TEST_TAB       > (       >    ID   CHAR(20),       >    COL1 CHAR(20)       > );    SQL>     对于多行SQL语句,同样也可以使用行首的【/】作为多行语句的结束符

  对于SQL多行语句,SQLCli将被等待语句结束符后把全部的SQL一起送给SQL引擎(包括可能的语句结束符分号)。

其他SQL语句

  • 其他SQL语句
    不符合上述条件的,即不是语句块也不是多行语句的,则在输入或者脚本回车换行后结束当前语句。
    结束后的语句会被立刻送到SQL引擎中执行。

SQL语句中的注释

  • 语句中的注释
    注释信息分为行注释和段落注释,这些注释信息不会被送入到SQL引擎中,而是会被SQLCli直接忽略。

    行注释的写法是: 【 ...SQL... -- Comment 】
    即单行中任何【--】标识符后的内容都被理解为行注释信息。

    段落注释的写法是: 【 ...SQL... /* Comment .... / 】
    即单行中任何【/
    】标识符和【*/】标识符中的内容都被理解为行注释信息。
    比如:

    SQL> CREATE TABLE TEST_TAB       > (       >    ID   CHAR(20),          -- ID信息,这是是一个行注释       >    COL1 CHAR(20)           -- 第一个CHAR字段,这也是一个行注释       >  /*  这个表是做测试用的,有两个字段:       >      ID和COL       >      这上下的4行内容都是段落注释       >   */       > );    SQL> 

设置程序的运行选项

通过SET命令,我们可以改变SQLCli的一些行为或者显示选项。

    SQL> set    Current set options:     +--------------------+----------------------+----------------------+    | Name               | Value                | Comments             |    +--------------------+----------------------+----------------------+    | WHENEVER_SQLERROR  | CONTINUE             |                      |    | PAGE               | OFF                  |                      |    | ECHO               | ON                   |                      |    | TIMING             | OFF                  |                      |    | TIME               | OFF                  |                      |    | OUTPUT_FORMAT      | LEGACY               | TAB|CSV|LEGACY       |    | CSV_HEADER         | OFF                  | ON|OFF               |    | CSV_DELIMITER      | ,                    |                      |    | CSV_QUOTECHAR      |                      |                      |    | FEEDBACK           | ON                   | ON|OFF               |    | TERMOUT            | ON                   | ON|OFF               |    | ARRAYSIZE          | 10000                |                      |    | SQLREWRITE         | OFF                  | ON|OFF               |    | LOB_LENGTH         | 20                   |                      |    | FLOAT_FORMAT       | %.7g                 |                      |    | DECIMAL_FORMAT     |                      |                      |    | DATE_FORMAT        | %Y-%m-%d             |                      |    | DATETIME_FORMAT    | %Y-%m-%d %H:%M:%S %f |                      |    | TIME_FORMAT        | %H:%M:%S %f          |                      |    | CONN_RETRY_TIMES   | 1                    | Connect retry times. |    | OUTPUT_PREFIX      |                      | Output Prefix        |    | SQL_EXECUTE        | PREPARE              | DIRECT|PREPARE       |    | JOBMANAGER         | OFF                  | ON|OFF               |    | JOBMANAGER_METAURL |                      |                      |    | SCRIPT_TIMEOUT     | -1                   |                      |    | SQL_TIMEOUT        | -1                   |                      |    +--------------------+----------------------+----------------------+    没有任何参数的set将会列出程序所有的配置情况。

控制参数解释-ECHO

    主要的控制参数解释:
    1.ECHO SQL回显标志, 默认为ON,即SQL内容在LOG中回显

        SQL> set ECHO ON      # 在LOG中将会回显SQL语句        SQL> set ECHO OFF     # 在LOG中不会回显SQL语句        例如:执行SELECT 3 + 5 COL1 FROM DUAL,        在ECHO打开下,log文件内容如下:        SQL> SELECT 3 + 5 COL1 FROM DUAL;        SQL> ===========        SQL> =  COL1 ===        SQL> ===========        SQL>           8        SQL> 1 rows selected.        在ECHO关闭下,log文件内容如下:        SQL> ===========        SQL> =  COL1 ===        SQL> ===========        SQL>           8        SQL> 1 rows selected.

控制参数解释-WHENEVER_SQLERROR

    2. WHENEVER_SQLERROR SQL错误终端表示, 用来控制在执行SQL过程中遇到SQL错误,是否继续。 默认是CONTINUE,即继续。
  目前支持的选项有:

       CONTINUE |     遇到SQL语句错误继续执行        EXIT     |     遇到SQL语句错误直接退出SQLCli程序

控制参数解释-PAGE

    3. PAGE 是否分页显示,当执行的SQL语句结果超过了屏幕显示的内容,是否会暂停显示,等待用户输入任意键后继续显示下一页,默认是OFF,即不中断。

控制参数解释-OUTPUT_FORMAT

    4. OUTPUT_FORMAT 显示格式, 默认是ASCII(会择机变化成TAB)  目前支持的选项有:

      LEGACY    |     显示格式为表格的格式(第三方工具提供,暂时保留,来作为兼容性)       CSV      |     显示格式为CSV文件的格式      TAB      |     显示格式为表格的格式

  以下是一个例子:

       SQL> set output_format legacy       SQL> select * from test_tab;       +----+----------+       | ID | COL2     |       +----+----------+       | 1  | XYXYXYXY |       | 1  | XYXYXYXY |       +----+----------+       2 rows selected.             SQL> set output_format csv       SQL> select * from test_tab;       "ID","COL2"       "1","XYXYXYXY"       "1","XYXYXYXY"       2 rows selected.       SQL>           

控制参数解释-LOB_LENGTH

    5. LOB_LENGTH 控制LOB字段的输出长度,默认是20
    由于LOB字段中的文本长度可能会比较长,所以默认不会显示出所有的LOB内容到当前输出中,而是最大长度显示LOB_LENGTH值所代表的长度对于超过默认显示长度的,将在输出内容后面添加...省略号来表示
    对于BLOB类型,输出默认为16进制格式。对于超过默认显示长度的,将在输出内容后面添加...省略号来表示

        SQL> set LOB_LENGTH 300     # CLOB将会显示前300个字符        例子,执行一个CLOB字段查询,CLOB中的信息为ABCDEFGHIJKLMNOPQRSTUVWXYZ        SQL> set LOB_LENGTH 5        SQL> SELECT CLOB1 FROM TEST_TAB;        SQL> ===========        SQL> =  CLOB1 ==        SQL> ===========        SQL>       ABCDE        SQL> 1 rows selected.        SQL> set LOB_LENGTH 15        SQL> =====================        SQL> =        CLOB1      =        SQL> =====================        SQL>    ABCDEFGHIJKLMNO...        SQL> 1 rows selected.

控制参数解释-FEEDBACK

    6. FEEDBACK 控制是否回显执行影响的行数,默认是ON,显示

       SQL> set feedback on       SQL> select * from test_tab;       +----+----------+       | ID | COL2     |       +----+----------+       | 1  | XYXYXYXY |       | 1  | XYXYXYXY |       +----+----------+       2 rows selected.       SQL> set feedback off       SQL> select * from test_tab;       +----+----------+       | ID | COL2     |       +----+----------+       | 1  | XYXYXYXY |       | 1  | XYXYXYXY |       +----+----------+

控制参数解释-TERMOUT

    7. TERMOUT 控制是否显示SQL查询的返回,默认是ON,显示

       SQL> set termout on       SQL> select * from test_tab;       +----+----------+       | ID | COL2     |       +----+----------+       | 1  | XYXYXYXY |       | 1  | XYXYXYXY |       +----+----------+       2 rows selected.       SQL> set termout off       SQL> select * from test_tab;       2 rows selected.

控制参数解释-FLOAT_FORMAT/DECIMAL_FORMAT/DATE_FORMAT/DATETIME_FORMAT/TIME_FORMAT

    8. FLOAT_FORMAT 控制浮点数字的显示格式,默认是%.7g

    SQL>  select abs(1.234567891234) from dual;    +----------+    | C1       |    +----------+    | 1.234568 |    +----------+    1 row selected.    SQL> set FLOAT_FORMAT %0.10g    SQL> select abs(1.234567891234) from dual;
                      

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap