zoukankan      html  css  js  c++  java
  • LR之Oracle 2tier协议录制Oracle脚本

    在一次测试中,需用到sql去查询Oracle数据,并去使用改数据时,查阅各种资料终于实现LoadRunner对Oracle数据库进行操作,分享给大家,也与大家共同进步~   同时也可用Loadrunner进行oracle数据库压力测试的时候,可以选择oracle 2tier协议进行录制。

    一、如果选择录制脚本的话,

      1、vugen会生成以下这些跟其他协议不同的文件:

        vdf.h

        作用:定义各种变量

        print.inl

        作用:打印表格使用的函数。录制脚本时才有用,写脚本的话没有用

        pre_cci.c

        作用:整个录制脚本的程序全部写在这里,可以在这里查看完整的函数过程

      2、录制脚本的好处

        需要的东西什么都有了。只要找到要执行的sql。然后将其中的sqltext部分参数化掉就可以了。

        select时生成的几个表格不错。可以在上面完成参数的保存和将搜索的结果保存成dat文件。用起来还是比较直观的

      3、录制脚本不好的地方

        使用plsql或者toad这样的工具录制出来的脚本有很多的操作就是测试中不需要的。对于不了解lr脚本的用户来说这些东西会造成一些麻烦。了解的话把这些不需要的语句都去掉就行了。

    二、如果选择自己写脚本的话

    需要用到以下这些语句,在编写过程,其中参考EnchanterBlue的ChinaUnix博客内容。

    #include "lrd.h"
    
    //定义各种变量。录制生成的脚本中,这些变量的定义在vdf.h中。
    static LRD_INIT_INFO InitInfo = {LRD_INIT_INFO_EYECAT};
    static LRD_DEFAULT_DB_VERSION DBTypeVersion[] =
    {
            {LRD_DBTYPE_NONE, LRD_DBVERSION_NONE}
    };
    
    Action()
    {
    //变量定义
    static void FAR * OraEnv1;
    static void FAR * OraSvc1;
    static void FAR * OraSes1;
    
    static void * OraDef12;
    static void * OraDef13;
    static void * OraDef14;
    
    static unsigned long    uliRowsProcessed;
    static unsigned long    uliFetchedRows;
        
    //LRD_VAR_DESC数据结构声明是很重要的,他是用来存储sql结果数据集的结构体
    //第一个参数,头文件中就是这么写的
    //第二个参数,设置结果集中最大行数,在lrd_ora8_fetch中的第二个参数如果大于该值,则会报错。
    //第三个参数,设置结果集中每一行的最大长度,如果获得的查询结果比定义的长,运行时就会报错,提示列被截断
    //最后一个参数是查询结果的类型,可以再帮助中的索引输入data types, database,列出的表格中是各种变量类型的名称
    //常用的数据类型有DT_VARCHAR, DT_DECIMAL, DT_DATETIME, DT_SF, DT_SZ, DT_NUMERIC    
    static LRD_VAR_DESC NAME_D13 =
    {"LVD", 15, 25, 0, {1, 1, 0}, DT_VARCHAR};
    static LRD_VAR_DESC VAL2_D1 =
    {"LVD", 15, 25, 0, {1, 1, 0}, DT_NUMERIC};
    static LRD_VAR_DESC VAL1_D1 =
    {"LVD", 15, 25, 0, {1, 1, 0}, DT_VARCHAR};
    
    //初始化数据库部分
    lrd_init(&InitInfo, DBTypeVersion);
    lrd_initialize_db(LRD_DBTYPE_ORACLE, 2, 0);
    lrd_env_init(LRD_DBTYPE_ORACLE, &OraEnv1, 0, 0);
    lrd_ora8_handle_alloc(OraEnv1, SERVER, &OraSrv1, 0);
    lrd_ora8_handle_alloc(OraEnv1, SVCCTX, &OraSvc1, 0);
    lrd_ora8_handle_alloc(OraEnv1, SESSION, &OraSes1, 0);
    
    //连接数据库
    lrd_server_attach(OraSrv1, "1.155", 5, 0, 0);
    lrd_ora8_attr_set_from_handle(OraSvc1, SERVER, OraSrv1, 0, 0);
    
    //设定数据库密码
    lrd_ora8_attr_set(OraSes1, USERNAME, "im", -1, 0);
    lrd_ora8_attr_set(OraSes1, PASSWORD, lr_decrypt("4a90de5201be6597554e"), -1, 0);
    
    //初始化连接session
    lrd_ora8_attr_set_from_handle(OraSvc1, SESSION, OraSes1, 0, 0);
    
    //开始执行事务
    lrd_session_begin(OraSvc1, OraSes1, 1, 0, 0);
    lrd_ora8_handle_alloc(OraEnv1, STMT, &OraStm7, 0);
    
    //提交sql
    lrd_ora8_stmt(OraStm7, "select userid, username, gender, name from userinfo where userid = 1", 1, 0, 0);
    
    //执行sql
    //第三个参数,执行次数
    //第四个参数,跳过记录数
    //第五个参数,返回执行影响的行数
    //第九个参数,设置执行模式,0是默认值执行(不提交),16不执行,32代表执行且自动提交
    //第十个参数,设置警告级别,0是默认值,代表错误,1代表警告
    lrd_ora8_exec(OraSvc1, OraStm7, 1, 0, &uliRowsProcessed, 0, 0, 0, 32, 1);
    
    //列绑定,如果不进行列绑定,lrd_ord8_fetch 将不能用。
    lrd_ora8_bind_col(OraStm7, &OraDef9, 1, &USERID_D10, 0, 0);
    lrd_ora8_bind_col(OraStm7, &OraDef10, 2, &USERNAME_D11, 0, 0);
    lrd_ora8_bind_col(OraStm7, &OraDef11, 3, &GENDER_D12, 0, 0);
    lrd_ora8_bind_col(OraStm7, &OraDef12, 4, &NAME_D13, 0, 0);
    
    //设置列属性
    lrd_ora8_attr_set(OraDef10, CHARSET_FORM, "1", -1, 0);
    lrd_ora8_attr_set(OraDef12, CHARSET_FORM, "1", -1, 0);
    
    //获取结果集
    //第二参数,如果是0返回最后一行,如果是负数则返回全部结果集,如果是整数则返回该数目的结果集行数(该整数小于结果集中定义的行数)
    //第三个参数,是控制RrintRow返回的结果集数。
    //第四个参数,返回查询结果集行数
    //第五个参数,是回调函数,用于打印返回的结果集
    lrd_ora8_fetch(OraStm7, 0, 15, &uliFetchedRows, PrintRow8, 0, 0, 0);
    
    //释放连接
    lrd_handle_free(&OraStm7, 0);
    
    //关闭连接session
    lrd_session_end(OraSvc1, OraSes1, 0, 0);
    
    //释放数据库资源
    lrd_server_detach(OraSrv1, 0, 0);
    
    //释放环境资源
    lrd_handle_free(&OraEnv1, 0);
    
    return 0;
    }
    
    (三)Oracle中常用函数的用法
    
    lrd_ora8_exec(OraSvc1, OraStm7, 3, 0, &uliRowsProcessed, 0, 0, 0, 32, 1);
    
    //将返回结果中的某个单元格中的传入参数供使用,它的使用方式类似注册函数,需要在fetch前调用,fetch后才能看到结果,行和列都从1开始。这里返回第4列、第一行的值
    lrd_ora8_save_col(OraStm7, 4, 1, 0, "value");
       
    lrd_ora8_fetch(OraStm7, 0, 15, &uliFetchedRows, PrintRow8, 0, 0, 0);
       
    lr_output_message("value is %s", lr_eval_string("{value}"));
    
    -------------------------------------------------------
    
    //这里的倒数第二个参数如果设置为0,代表光执行不提交事务,那么我们可以配合使用lrd_ora8_commit提交事务
    lrd_ora8_exec(OraSvc1, OraStm7, 3, 0, &uliRowsProcessed, 0, 0, 0, 0, 1);
    
    lrd_ora8_commit(OraSvc1, 0, 0);
    
    -------------------------------------------------------
    
    //要查看返回的结果集,必须设置log属性为extended log 且勾选data returened by server时,才能看到结果
    lrd_ora8_print(OraStm7, PrintRow8);
    
    -------------------------------------------------------
    
    //rowid这个函数不是随便用的,只有在进行了insert、update后才可以用,普通使用select查询后使用lrd_ora8_save_last_rowid是无效的
    lrd_ora8_save_last_rowid(OraStm7, "rowid");
    lr_output_message("rowid is %s", lr_eval_string("{rowid}"));
    
    -------------------------------------------------------
    
    //变量绑定操作,如果绑定了多个变量,那么在调用exec的时候也需要指定执行多次,据说采用这种方式进行参数化的效率比直接sql进行参数化的效率高
    lrd_ora8_stmt(OraStm7, "insert into testtable values(:V2, :V1)", 1, 0, 0);
    
    //变量绑定
    lrd_assign(&VAL1_D1, "abc", "", 0, 0);
    lrd_assign(&VAL1_D1, "def", "", 1, 0);
    lrd_assign(&VAL1_D1, "ghi", "", 2, 0);
    
    lrd_assign(&VAL2_D1, "123", "", 0, 0);
    lrd_assign(&VAL2_D1, "456", "", 1, 0);
    lrd_assign(&VAL2_D1, "789", "", 2, 0);
    
    //绑定变量操作符
    lrd_ora8_bind_placeholder(OraStm7, &OraDef13, "V1", &VAL1_D1, 0, 0, 0);
    lrd_ora8_bind_placeholder(OraStm7, &OraDef14, "V2", &VAL2_D1, 0, 0, 0);
    
    //由于变量绑定了3条记录,那么在执行的时候也需要执行三次
    lrd_ora8_exec(OraSvc1, OraStm7, 3, 0, &uliRowsProcessed, 0, 0, 0, 32, 1);
    

    三、录制脚本步骤:

      1、首先本地必须要安装LoadRunner吧^~^...  其中也必要有oracle客户端;

      2、在oracle客户端的网络配置Net Manager中,配置数据库网络服务名,例如:"25_devel",用于连接数据库。同plsql中登录中的数据库名。

      3、LR选择Oracle(2-Tier)协议,选择Win32录制程序,程序路径选择oracle应用程序中SQL Plus程序的路径中"sqlplus.exe"程序,

      4、调用SQL Plus后,出现该界面,输入:数据库用户/密码@服务名,即可成功进入数据库,执行数据库命令即可;

      5、退出数据库,结束录制脚本。

      6、增强脚本,对于这样的工具录制出来的脚本有很多的操作就是测试中不需要的。对于不了解lr脚本的用户来说这些东西会造成一些麻烦。了解的话把这些不需要的语句都去掉就行了,也便于调试,思路清晰,可参考以下我调试的脚本。

    大家可参考我调试的脚本:

    /* -------------------------------------------------------------------------------
    	Script Title       : 
    	Script Description : 
                            
                            
    	Recorder Version   : 8859
       ------------------------------------------------------------------------------- */
    
    vuser_init()
    {
      //初始化数据库部分
    	lrd_init(&InitInfo, DBTypeVersion);
    	lrd_initialize_db(LRD_DBTYPE_ORACLE, 2, 0);
    	lrd_env_init(LRD_DBTYPE_ORACLE, &OraEnv1, 0, 0);
    	lrd_ora8_handle_alloc(OraEnv1, SERVER, &OraSrv1, 0);
    	lrd_ora8_handle_alloc(OraEnv1, SVCCTX, &OraSvc1, 0);
    	lrd_ora8_handle_alloc(OraEnv1, SESSION, &OraSes1, 0);
    	lrd_ora8_handle_alloc(OraEnv1, SESSION, &OraSes2, 0);
    //	lr_think_time(14);
    
      //连接数据库
    	lrd_server_detach(OraSrv1, 0, 0);
    	lrd_server_attach(OraSrv1, "25_devel", 8, 0, 0);
    	lrd_ora8_attr_set_from_handle(OraSvc1, SERVER, OraSrv1, 0, 0);
    
      //设定数据库密码
    	lrd_ora8_attr_set(OraSes1, USERNAME, "smart", -1, 0);
    	lrd_ora8_attr_set(OraSes1, PASSWORD, lr_decrypt("4a90de5201be6597554e"), -1, 0);
    
      //初始化连接session
    	lrd_ora8_attr_set_from_handle(OraSvc1, SESSION, OraSes1, 0, 0);
    	lrd_session_begin(OraSvc1, OraSes1, 1, 0, 0);
    
    
    /*
    	lrd_ora8_handle_alloc(OraEnv1, STMT, &OraStm1, 0);
    	lrd_ora8_stmt(OraStm1, "SELECT USER FROM DUAL", 1, 32, 0);
    	lrd_ora8_exec(OraSvc1, OraStm1, 0, 0, &uliRowsProcessed, 0, 0, 0, 0, 
            0);
    	lrd_ora8_bind_col(OraStm1, &OraDef1, 1, &USER_D1, 0, 0);
    	//lrd_ora8_fetch(OraStm1, -1, 1, &uliFetchedRows, PrintRow2, 2, 0, 0);
    	//GRID8(2);
    
    
    	lrd_handle_free(&OraStm1, 0);
    	lrd_ora8_handle_alloc(OraEnv1, STMT, &OraStm2, 0);
    	lrd_ora8_stmt(OraStm2, "BEGIN DBMS_OUTPUT.DISABLE; END;", 1, 32, 0);
    	lrd_ora8_exec(OraSvc1, OraStm2, 1, 0, &uliRowsProcessed, 0, 0, 0, 0, 
            0);
    	lrd_handle_free(&OraStm2, 0);
    	lrd_ora8_handle_alloc(OraEnv1, STMT, &OraStm3, 0);
    	lrd_ora8_stmt(OraStm3, "SELECT ATTRIBUTE,SCOPE,NUMERIC_VALUE,CHAR_VALUE,DATE_VALUE FROM "
            "SYSTEM.PRODUCT_PRIVS WHERE (UPPER('SQL*Plus') LIKE UPPER"
            "(PRODUCT)) AND (USER LIKE USERID)", 1, 32, 0);
    	lrd_ora8_exec(OraSvc1, OraStm3, 0, 0, &uliRowsProcessed, 0, 0, 0, 0, 
            0);
    	lrd_ora8_bind_col(OraStm3, &OraDef2, 1, &ATTRIBUTE_D2, 0, 0);
    	lrd_ora8_bind_col(OraStm3, &OraDef3, 2, &SCOPE_D3, 0, 0);
    	lrd_ora8_bind_col(OraStm3, &OraDef4, 3, &NUMERIC_VALUE_D4, 0, 0);
    	lrd_ora8_bind_col(OraStm3, &OraDef5, 4, &CHAR_VALUE_D5, 0, 0);
    	lrd_ora8_bind_col(OraStm3, &OraDef6, 5, &DATE_VALUE_D6, 0, 0);
    	//lrd_ora8_fetch(OraStm3, -0, 1, &uliFetchedRows, 0, 2, 0, 0);
    	lrd_handle_free(&OraStm3, 0);
    	lrd_ora8_handle_alloc(OraEnv1, STMT, &OraStm4, 0);
    	lrd_ora8_stmt(OraStm4, "SELECT CHAR_VALUE FROM SYSTEM.PRODUCT_PRIVS WHERE   (UPPER"
            "('SQL*Plus') LIKE UPPER(PRODUCT)) AND   ((USER LIKE USERID) "
            "OR (USERID = 'PUBLIC')) AND   (UPPER(ATTRIBUTE) = 'ROLES')", 1, 32, 0);
    	lrd_ora8_exec(OraSvc1, OraStm4, 0, 0, &uliRowsProcessed, 0, 0, 0, 0, 
            0);
    	lrd_ora8_bind_col(OraStm4, &OraDef7, 1, &CHAR_VALUE_D7, 0, 0);
    	//lrd_ora8_fetch(OraStm4, -0, 1, &uliFetchedRows, 0, 2, 0, 0);
    	lrd_handle_free(&OraStm4, 0);
    	lrd_ora8_handle_alloc(OraEnv1, STMT, &OraStm5, 0);
    	lrd_ora8_stmt(OraStm5, "BEGIN DBMS_APPLICATION_INFO.SET_MODULE(:1,NULL); END;", 1, 32, 0);
    	lrd_assign(&P1D8, "SQL*Plus", 0, 0, 0);
    	lrd_ora8_bind_placeholder(OraStm5, &OraBnd1, "1", &P1D8, 
            LRD_BIND_BY_POS, 0, 0);
    	//lrd_ora8_exec(OraSvc1, OraStm5, 1, 0, &uliRowsProcessed, 0, 0, 0, 0, 
            0);
    //	GRID0(4);
    
    	lrd_handle_free(&OraStm5, 0);
    	lrd_ora8_handle_alloc(OraEnv1, STMT, &OraStm6, 0);
    	lrd_ora8_stmt(OraStm6, "SELECT DECODE('A','A','1','2') FROM DUAL", 1, 32, 0);
    	lrd_ora8_bind_col(OraStm6, &OraDef8, 1, &DECODE_A_A_1_2_D9, 0, 0);
    	lrd_ora8_exec(OraSvc1, OraStm6, 1, 0, &uliRowsProcessed, 0, 0, 0, 0, 
            0);
    	//lrd_ora8_print(OraStm6, PrintRow6);
    	//GRID0(6);
    
    	lrd_handle_free(&OraStm6, 0);
    	lrd_ora8_commit(OraSvc1, 0, 0);
    	lrd_ora8_commit(OraSvc1, 0, 0);
    	//lr_think_time(13);
    */
    
    	lrd_ora8_handle_alloc(OraEnv1, STMT, &OraStm7, 0);
    
    
    	return 0;
    }
    
    Action()
    {
    
    	lr_start_transaction("02_查询");
    
         //提交并执行sql
    	lrd_ora8_stmt(OraStm7, "SELECT DISTINCT a.order_id,a.manager_a ,b.longitude,b.latitude FROM "
            "tl9_so_order_push_record a,smart.tl9_so_order_info b WHERE "
            "a.push_type='0'AND a.is_grab='1'AND b.order_id=a.ORDER_ID "
            "AND b.longitude like '%113.76%'", 1, 32, 0);
    	lrd_ora8_exec(OraSvc1, OraStm7, 0, 0, &uliRowsProcessed, 0, 0, 0, 0, 
            0);
    
    	lr_end_transaction("02_查询", LR_AUTO);
         
       //列绑定,如果不进行列绑定,lrd_ord8_fetch 将不能用。    
    	lrd_ora8_bind_col(OraStm7, &OraDef9, 1, &ORDER_ID_D10, 0, 0);
    	lrd_ora8_bind_col(OraStm7, &OraDef10, 2, &MANAGER_A_D11, 0, 0);
    	lrd_ora8_bind_col(OraStm7, &OraDef11, 3, &LONGITUDE_D12, 0, 0);
    	lrd_ora8_bind_col(OraStm7, &OraDef12, 4, &LATITUDE_D13, 0, 0);
    
    	//行和列都从1开始。存储返回第1列、第一行的值
    	lrd_ora8_save_col(OraStm7, 1, 1, 0, "ORDER_ID");
    	//存储返回第2列、第一行的值
    	lrd_ora8_save_col(OraStm7, 2, 1, 0, "MANAGER_A");
    	lrd_ora8_save_col(OraStm7, 3, 1, 0, "LONGITUDE");
    	lrd_ora8_save_col(OraStm7, 4, 1, 0, "LATITUDE");
            
        //获取结果集
    	lrd_ora8_fetch(OraStm7, -1, 15, &uliFetchedRows, PrintRow8, 2, 0, 0);
    
    
    
    	return 0;
    }
    
    vuser_end()
    {
        //释放连接
    	lrd_handle_free(&OraStm7, 0);
    	
            /*tuichu*/
    
        //关闭连接session
    	lrd_session_end(OraSvc1, OraSes1, 0, 0);
        //释放数据库资源
    	lrd_server_detach(OraSrv1, 0, 0);
        //释放环境资源
    	lrd_handle_free(&OraEnv1, 0);
    
    
    	return 0;
    } 

      输出结果:

  • 相关阅读:
    webrtc vp8与h264 sdp文件解读
    如何着手学习WebRTC开发(转)
    python第二次周末大作业
    python 面向对象(六)MRO C3算法 super
    python 面向对象(五)约束 异常处理 MD5 日志处理
    python 面向对象(经典作业讲解)
    python 面向对象(四)反射
    python 面向对象(三)类与类之间的关系 初始化方法一些类
    python 面向对象(二)成员
    python 面向对象(一)初识面向对象
  • 原文地址:https://www.cnblogs.com/zwh-Seeking/p/13809612.html
Copyright © 2011-2022 走看看