51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 1873|回复: 2
打印 上一主题 下一主题

[原创] qtp 读取数据库里的数据

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2011-4-6 16:52:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
当我有一条普通的sql语句的时候,我用下面的vbscript代码去执行这条sql,从而把oracle数据库里相应的数据取出来:
Public Function GetMultiRowData(sqlQuery,intColNum,arrExpData())

        Dim rowcount
   
        Set oResultSet = oCon.Execute(sqlQuery)
        ' Place the cursor at the first record
        'oResultSet.MoveFirst
        rowcount =0
       
        Do Until oResultSet.EOF
           rowcount=rowcount + 1
           oResultSet.MoveNext
        Loop
         If rowcount>=1 Then
        ReDim arrExpData(rowcount,intColNum)
        rowcount =0
        oResultSet.MoveFirst
        Do Until oResultSet.EOF  
                For i = 0 to intColNum
                                arrExpData(rowcount,i) = oResultSet.Fields(i)
                Next
                oResultSet.MoveNext
                rowcount=rowcount + 1
        Loop
        oResultSet.close
        Set oResultSet = Nothing
        else
        End If
   
End Function

现在我手头的这段sql不是普通的sql,是关于dbms_output.Put_LINE的,比如说:
declare

s_selected_portfolio   VARCHAR2(9):= '00IE' ;
s_inception_date       DATE := to_date('2008/10/08', 'yyyy/mm/dd') ;
s_to_date              DATE := to_date('2009/10/28', 'yyyy/mm/dd') ;
n_port_key             NUMBER(38) ;
n_inception_date_key   NUMBER ;
n_to_date_key          NUMBER ;
n_base_curr_key        NUMBER(38);

n_starting_cash     NUMBER(38,10);   

n_equity_gl_part1   NUMBER(38,10);
n_equity_gl_part2   NUMBER(38,10);
n_equity_gl         NUMBER(38,10);

n_futures_gl_part1  NUMBER(38,10);
n_futures_gl_part2  NUMBER(38,10);
n_futures_gl        NUMBER(38,10);

n_currency_gl_part1 NUMBER(38,10);
n_currency_gl_part2 NUMBER(38,10);
n_currency_gl       NUMBER(38,10);

n_cash_gl           NUMBER(38,10);

n_cash_flows        NUMBER(38,10);

n_current_market_value  NUMBER(38,10);

n_gross_future_gl           NUMBER(38,10);
n_gross_future_gl_part1     NUMBER(38,10);
n_gross_future_gl_part2     NUMBER(38,10);
n_net_future_gl             NUMBER(38,10);  

begin
--- get port_key for the selected primary portfolio
select port_key
into n_port_key
from gdm_psr_dim_portfolio
where port_new_code = s_selected_portfolio
and port_record_Status ='A'  ;


--- get date_key for inception date and to date
select dimd_date_key
into n_inception_date_key
from gdm_psr_dim_date
where dimd_full_date = s_inception_date ;

select dimd_date_key
into n_to_date_key
from gdm_psr_dim_date
where dimd_full_date = s_to_date ;


--functional currency key for the portfolio
select cccy_key
into n_base_curr_key
from gdm_psr_currency   
where cccy_record_status = 'A'
  and cccy_code = (select port_primary_ccy from gdm_psr_dim_portfolio where port_new_code = s_selected_portfolio and port_record_Status ='A' ) ;

---current market value

--get starting cash
select tmtr_amount
into n_starting_cash
from (
  select tmtr_amount,tmtr_trade_date_key
  from GDM_PSR_FACT_TM_TRANSACTION
  where tmtr_amount is not null and tmtr_amount <> 0 and TMTR_CATEGORY_CD = 3  and tmtr_type_key = 521 -- 700 cash contrib
    and tmtr_port_key = n_port_key
    and ( select MGRG_MANAGER_GROUP_CODE from GDM_PSR_DIM_MANAGER_GROUP where mgrg_manager_group_key = tmtr_manager_group_key) = '5CA'
    and ( select basi_currency_basis_code from GDM_PSR_DIM_BASIS where basi_basis_key = tmtr_basis_key and basi_currency_basis_desc = 'FUNCTIONAL' and basi_currency_basis_code = 2) = 2
    and ( select basi_date_basis_desc from GDM_PSR_DIM_BASIS where basi_basis_key = tmtr_basis_key ) = 'Trade'
  order by tmtr_trade_date_key
) where rownum = 1 ;

dbms_output.PUT_LINE('Starting Cash = '||n_starting_cash);

那我要怎么利用这段现有的sql去读数据库里的Starting Cash这个值呢?前提是不想拆分这些sql,因为后面还有一大段类似的语句,而且每个输出值都是后面一个的输入参数。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

  • TA的每日心情
    开心
    2014-12-23 11:19
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]测试小兵

    2#
    发表于 2011-4-7 09:27:36 | 只看该作者
    写的一些什么啊,看不懂!学习吧```
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2015-10-19 13:26
  • 签到天数: 2 天

    连续签到: 2 天

    [LV.1]测试小兵

    3#
    发表于 2011-4-12 14:06:32 | 只看该作者
    本帖最后由 kavensyw 于 2011-4-12 15:33 编辑

    (1)可以的话最好用存储过程,写日志表,然后在QTP中用ADODB
    (2)实在不行用如下方式
    1.把sql块保存为.sql脚本,要取的变量值用unl_file等方法写到到.txt日志文件,
    2.在QTP中调用sqlplus,运行sql脚本文件,
    3. QTP中读取日志文件中保存的相应值;
    4. 日志文件不过不需要,则删除;需要则保留

    试验脚本如下:

    1. Dim WshShell
    2. set WshShell = CreateObject("wscript.Shell")
    3. WshShell.run "cmd"
    4. wait 1
    5. WshShell.SendKeys "sqlplus darwen/suzsoft@test"
    6. wait 1
    7. WshShell.SendKeys "{ENTER}"
    8. wait 1
    9. WshShell.SendKeys "@H:\Loader\Prog.sql;"
    10. wait 1
    11. WshShell.SendKeys "{ENTER}"
    12. wait 1
    13. WshShell.SendKeys "/"
    14. wait 1
    15. WshShell.SendKeys "{ENTER}"
    16. wait 1
    17. '关闭sqlplus
    18. WshShell.SendKeys "exit"
    19. wait 1
    20. WshShell.SendKeys "{ENTER}"
    21. '关闭cmd
    22. WshShell.SendKeys "exit"
    23. wait 1
    24. WshShell.SendKeys "{ENTER}"
    复制代码


    Prog.sql内容如下:
    1. DECLARE
    2. v_file UTL_FILE.file_type;
    3. v_msg VARCHAR2(500);
    4. BEGIN
    5. v_file := UTL_FILE.fopen('TEST_LOADER', 'test.log', 'a');

    6. SELECT 'mdt_customer记录总数: '||COUNT(1) INTO v_msg FROM mdt_customer a;
    7. UTL_FILE.put_line(v_file,v_msg);
    8. UTL_FILE.fclose(v_file);
    9. EXCEPTION
    10. WHEN OTHERS THEN
    11. NULL;
    12. END;
    复制代码


    log结果如下:
    mdt_customer记录总数: 70

    自动运行过程如下:

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

    x
    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-20 14:17 , Processed in 0.078185 second(s), 28 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表