在一次测试中,需用到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脚本的用户来说这些东西会造成一些麻烦。了解的话把这些不需要的语句都去掉就行了。

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

需要用到以下这些语句

#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、退出数据库,结束录制脚本。

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

/* -------------------------------------------------------------------------------
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);
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_查询"); 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_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*/ lrd_session_end(OraSvc1, OraSes1, 0, 0);
lrd_server_detach(OraSrv1, 0, 0);
lrd_handle_free(&OraEnv1, 0); return 0;
}

  输出结果:

在编写过程,其中参考EnchanterBlue的ChinaUnix博客内容。

LR之Oracle 2tier协议录制Oracle脚本的更多相关文章

  1. Badboy录制Jmter脚本

    提纲 1.特性和用途 2.下载和安装 3.界面介绍 4.录制脚本(注意:badboy默认是打开就开始录制,需要在step双击后进行取消默认设置) 5.添加断言(参数化设置,注意:badboy默认只运行 ...

  2. LoadRunner11_录制Oracle数据库脚本

    [oracle环境] ①oracle:无需在本地安装oracle,但是oracle的odbc驱动一定要装:(我的安装路径为 D:\oracle ).安装好后在环境变量 " Path &quo ...

  3. LR破解版录制手机脚本(一)模拟器录制

    最近在网上听到好多童鞋都在问如何用LR做手机性能测试,恰好自己对这方面也挺感兴趣,经过查阅很多资料,形成此文档以做备注~!如果有感觉我写的不对的地方,敬请指正,谢谢~!     其实自从LR12出来之 ...

  4. LR破解版录制手机脚本

    LR破解版录制手机脚本 最近在网上听到好多童鞋都在问如何用LR做手机性能测试,恰好自己对这方面也挺感兴趣,经过查阅很多资料,形成此文档以做备注~!如果有感觉我写的不对的地方,敬请指正,谢谢~!     ...

  5. 基于LR的HTTP协议接口性能测试脚本实例

    背景介绍 XXX项目性能测试中新增业务场景:XX设备的在线激活,因为存在多用户同时在线激活,故需进行性能测试以确认后台服务器系统在多用并发时功能是否正常,性能指标是否满足规格要求.用户使用场景为用户通 ...

  6. LR中HTTP协议录制模式选择

    在LR中使用HTML/HTTP协议进行脚本录制时面临正确选择HTTP-based script / URL-base script 录制模式的问题,以下是比较官方的建议:1)基于浏览器的应用程序推荐使 ...

  7. Loadrunner:POP3协议录制收信,使用foxmail录制到的脚本为空

    以下录制方法使得录制到的脚本为空: (1)打开Virtual User Generator,点击“新建Vuser脚本”,在弹出的向导页面,选择“新建单协议脚本”,选择“POP3”协议,并确定 (2)在 ...

  8. 【Loadrunner】LR破解版录制手机脚本

    LR破解版录制手机脚本          最近在网上听到好多童鞋都在问如何用LR做手机性能测试,恰好自己对这方面也挺感兴趣,经过查阅很多资料,形成此文档以做备注~!如果有感觉我写的不对的地方,敬请指正 ...

  9. Oracle手边常用70则脚本知识汇总

    Oracle手边常用70则脚本知识汇总 作者:白宁超 时间:2016年3月4日13:58:36 摘要: 日常使用oracle数据库过程中,常用脚本命令莫不是用户和密码.表空间.多表联合.执行语句等常规 ...

随机推荐

  1. 面试【JAVA基础】锁

    1.锁状态 锁的状态只能升级不能降级. 无锁 没有锁对资源进行锁定,所有线程都能访问并修改同一个资源,但同时只有一个线程能修改成功.其他修改失败的线程会不断重试,直到修改成功,如CAS原理和应用是无锁 ...

  2. 05_Python的文件操作

    1.文件操作概述 # 文件是用于数据存储的单位通常用来长期存储设置,文件中的数据是以字节为单位进行顺序存储的     1.打开文件: f = open("xxx") 或 with ...

  3. 吴恩达《深度学习》-课后测验-第三门课 结构化机器学习项目(Structuring Machine Learning Projects)-Week1 Bird recognition in the city of Peacetopia (case study)( 和平之城中的鸟类识别(案例研究))

    Week1 Bird recognition in the city of Peacetopia (case study)( 和平之城中的鸟类识别(案例研究)) 1.Problem Statement ...

  4. Python3 学习笔记之 数据类型

  5. html+css入门基础案例之圣诞那些事

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. Video.js + HLS 在production环境下webpack打包后出错的解决方案

    Video.js是一个非常强大的视频播放库,能在微信下完美提供inline小窗口播放模式,但当涉及到hls格式视频播放时就比较麻烦,出现的数种现象都不好解决. 错误现象:  1.  PC Chrome ...

  7. C#开发PACS医学影像处理系统(十四):处理Dicom影像窗宽窗位

    概念解释(网络资料): 窗宽: 窗宽指CT图像所显示的CT 值范围.在此CT值范围内的组织结构按其密度高低从白到黑分为16 个灰阶以供观察对比.例如,窗宽选定为100 Hu ,则人眼可分辨的CT值为1 ...

  8. mariadb 3

    MariaDB第三章(select)   基本查询 --查询基本使用(条件,排序,聚合函数,分组,分页) --创建学生表 create table students ( id int unsigned ...

  9. 测试必备:jmeter测试http协议接口的各种传参方式

    测试接口,postman和jmeter是用得最频繁的工具,特别是jmeter,支持很多种协议,且除了测功能,还能做自动化测试和性能测试.下面主要介绍jmeter测试http协议接口的用法,包含get, ...

  10. 你还在寻找Navicat的破解版本?你应该了解开源免费的DBeaver

    前言 你是否还在各个"免费绿色"的下载网站上寻找navicat的破解版本,或者已经通过某些方式破解了navicat的特定版本.你或者是在一家对安全和软件著作权比较看重的公司,明令禁 ...