天软金融分析.NET函数大全 > TSL函数 > 资源访问函数 > 数据库访问函数

ExecSQL    

简述
执行SQL语句,该函数总共有8个参数,其中,Flags、Params、UserName;Password、DataKeepNull为可选参数,在调用时,注意参数顺序按定义中的顺序来传入,不需要的参数可以跳过不给。
比如只给Params这个可选参数,则调用代码为:
param:=array("TestParamName":("Value":"ParamNameValue","Direction":3));
execsql(param,"test","myStoredProctest",result);

此外,在以上基础上,如果执行的是存贮过程,需要将参数带入,则插入一个参数在最前面,类型为数组,具体结构见参数说明。

如果数据库别名配置在本地,对本地的数据进行操作,则在调用execsql之前,需要加入rdo2关键字(见范例);如果数据库别名配置在服务器,则不需要rdo2关键字。
ExecSQL允许当别名为WideString的时候,默认使用WideString。
定义
ExecSQL([Flags:Integer;][Params:Array;]DataBaseName;SQL:String;VarResult:Array[;UserName;Password:String][;DataKeepNull:Boolean]):Interger;
参数
名称类型说明
Flags功能标识符,可选参数,设置值如下
高位二进制位说明取值十六进制表达默认值
31位是否缓存SQL语句,当SQL语句不变需要执行多次的时候,减少SQL编译开销,提高效率Flags .& 0x80000000 <>01:缓存命令0:不缓存命令1:0x800000000
30位是否不访问元数据,存贮过程参数类型判定依赖了元数据,但许多其他操作无需进行元数据判别,设置该选项在SQL调用次数很多时可以提高效率。Flags .& 0x40000000 <>01:不访问元数据0:访问元数据1:0x400000000
29位是否将返回字段名转换为大写,在第28位为1的时候生效。Flags .& 0x20000000 <>01:转为大写0:转为小写1:0x200000000
28位字段名大小写转换是否生效Flags .& 0x10000000 <>01:生效0:无效1:0x100000000
27位开启openforwardonly模式,在不需要对已访问过的数据进行再次访问时,可以设置该种模式,减少中间数据的缓存,降低内存开销,减少内存空洞,提高交互性能。(后台内存管理有关的,对于服务器落地用户有用,与客户端用户关系不大)具体,可参考openforwardonly模式Flags .& 0x8000000 <>01:开启openforwardonly模式0:关闭openforwardonly1:0x80000000
26位启用NotOpenForwardOnly, 在交互环境中设置默认为openforwardonly的方式下,可以通过设置此位来取消当前语句的游标类型(后台内存管理有关的,对于服务器落地用户有用,与客户端用户关系不大)Flags .& 0x4000000 <>01:Notopenforwardonly模式0:openforwardonly模式1:0x40000000
低位值返回值result的内容Flags .& 30:Result为结果集1:Result为字段结构信息2:Result[0]返回结果, Result[1]返回字段结构信息0:01:12:2(与十进制显示一致,可用十进制进行表示)0
ParamsArray,TableArray数组类型,可选参数,以存贮过程的参数名为下标的一个数组描述存贮过程的参数,其每个存贮参数下标指向的值的结构如下:
下标说明
Direction0-4代表参数类型:0:未知参数类型。1:输入参数。2:输出参数。3:输入输出参数。4:返回值参数。当为2、4的时候,Value下标输入时可以省略。当为2,3,4的时候,则执行完后入口的Value下标值会被设置为返回的值。
Value代表参数的值
DataBaseNameString字符串类型,数据库别名,用于指定数据库名称;例如[SQLAlias],配置方法详见数据库配置
SQLString字符串类型,需要执行的SQL语句。
Result如果执行正确,则返回执行的结果,如果结果集只有一个,则返回的内容为结果集的本身,如果结果集返回的个数>1,那么返回的内容为包括多个结果集的数组;如果执行失败,则返回错误的原因串;如果执行正确,而且执行无结果集,则返回改变的记录条数。UserName,Password:字符串类型,可选参数,用于指定访问数据库的用户名和口令;如果缺省则用户名和口令使用服务器默认指定的。
DataKeepNullBoolean布尔类型,可选参数,用于设定是否在结果集中保留为空的结果;缺省不保留空,例如某些空类型转换为空字符串,某些类型转换为数字0等等。
返回如果执行SQL正确,则返回结果集的个数;如果执行的无结果集且执行正确,返回1,如果执行过程出错,则将返回假。
  • 范例



    范例01:同时返回结果集与字段结构信息,并将字段转换为大写(以MySQL为例)
    f31:=0;      //不缓存
    f30:=0x40000000; //不访问元数据
    f29:=0x20000000; //转为大写
    f28:=0x10000000; //转大小写有效
    df:=2;      //同时返回结果集与字段结构信息
    Flags:=f31+f30+f29+f28+df;
    echo Flags;
    echo 'FLAGS高四位:',Flags.&0x80000000<>0,Flags.&0x40000000 <>0,Flags.&0x20000000 <>0,Flags.&0x10000000 <>0;
    echo 'FLAGS低位值:',Flags.&3;
    //test表中数据为浦发银行2023-8-31至2023-9-13的收盘价
    sqlstr:='select * from test where close<(select avg(close) from test)';
    ret:=rdo2 ExecSQL(Flags,'mysql',sqlstr,result);
    if ret then
        return result;
    else
        return rdo2 SQLErrorMsg();//报错信息

    //返回结果

    其中,
    Result[0]返回结果:

    Result[1]返回字段结构信息:


    范例2:
    //表名:SZ000002cy_5m
    //数据库别名:cfsql (SQL和天软交互时配置的数据库别名)
    s:="select * from SZ000002cy_15m;";
    ret:=rdo2 execsql("cfsql",s,data);
    if ret then
      return data;

    结果:


    范例03:存贮过程的调用,参数名TestParamName是一个输入输出参数,最后param的结果会被修改。
    param:=array("TestParamName":("Value":"ParamNameValue","Direction":3));
    execsql(param,"test","myStoredProctest",result);


    Sys_refcursor输出参数:

    API链接方式支持oracle存贮过程的sys_refcursor输出参数,会作为多结果集返回。

    假定oracle存贮过程如下:

    create or replace procedure testproc(b out sys_refcursor,c out sys_refcursor) is

    begin

    open b for

    select * from TESTTABLE;

    open c for

    select * from TESTTABLE;

    end testproc;

    可以使用如下代码来获得两个结果集:

    a:=array(

    "b":("Direction":2,"Type":22),

    "c":("Direction":2,"Type":22)

    );

    execsql(a,"ora2","TESTPROC",r);

    注:ADO模式无法支持此种类型返回参数。

    范例04:Array DML 方式批量插入数据范例
    //获取数据模型
    r:=TSFL_SQL_GetData(20130101T,20131231T);
     {Insert语句,注意下列数据中EndDate,StockID,StockName,price,vol是占位符,对应param数组中的占位符。与数据库表中列名无关,此处没有指定Test的列名,按照数据库表中列的顺序给定数据。如需指定列名,在Test后带上列名}
    s:="insert into Test values(:EndDate,:StockID,:StockName,:price,:vol)";
     {插入数据列值:EndDate,StockID,StockName,price,vol是占位符,

    }
    param:=array("EndDate":array("Direction":1, "Value":r[:,'EndDate']),
          "StockID":array("Direction":1, "Value":r[:,'StockId']),
          "StockName":array("Direction":1, "Value":r[:,'StockName']),
          "price":array("Direction":1, "Value":r[:,'Close']),
          "vol":array("Direction":1, "Value":r[:,'Vol']));
     //执行SQL操作
    ret:=rdo2 ExecSQL(param, 'SQLAlias', s, result);
    return result;



    范例05:输出转为WideString类型
    SQLStr1:="select * from test";
    //数据库别名使用widestring宽字节
    DBname:=L'pgsql';
    ExecSQL(DBname,SQLStr1,t);
    echo tostn(t);
    return t;




    源串中字符串为宽字节:



    更多关于数据库的详细说明及范例,见专题:

    http://www.tinysoft.com.cn/tsdn/helpdoc/index.tsl?itemid=15106
相关
FAQ/知识库链接