zoukankan      html  css  js  c++  java
  • Caché数据库学习笔记(3)

    目录

    Query函数及其测试

    重建索引表

    Management portal简介

    远程访问Ensemble

     ===================================================

     ===================================================

    Query函数及其测试:

    query工作原理:

    .cls部分:

    首先根据query传入数据建立索引表IdxA(需要在portal里build)声明query时设置函数名、传入变量和传出变量列表包含三个classmethod: Execute, Fetch, Close

    Execute设置查找数据时的依据,包含全部主键及索引,存入qHandle数组里

    Fetch为主体,传入查找依据(qHandle), Row(需要得到的列表), AtEnd(0可以进行下去,1终止)

    设置初始值:AtEnd = 1(若后面查找不到数据则终止), Row为空,查找依据数组设置回变量方便写函数,调用Routine,将返回值赋给各个变量,为下一次循环准备

    Query GetPlan(Status As %Integer, StartDate As %Integer) As %Query(ROWSPEC = "PlanNo:%String,PatientId:%String,StartDate:%Integer,EndDate:%Integer,Module:%String,Status:%Integer,DoctorId:%String") [ SqlProc ]
    {
    }
    
    ClassMethod GetPlanExecute(ByRef qHandle As %Binary, Status As %Integer, StartDate As %Integer) As %Status
    {
             Set qHandle(0) = "" ;PlanNo
             Set qHandle(1) = StartDate
             Set qHandle(2) = Status
             Quit $$$OK
    }
    
    ClassMethod GetPlanClose(ByRef qHandle As %Binary) As %Status [ PlaceAfter = GetPlanExecute ]
    {
             Kill qHandle
             Quit $$$OK
    }
    
    ClassMethod GetPlanFetch(ByRef qHandle As %Binary, ByRef Row As %List, ByRef AtEnd As %Integer = 0) As %Status [ PlaceAfter = GetPlanExecute ]
    {
             Set AtEnd                   = 1
             Set Row             = ""
             Set PlanNo       = qHandle(0)
             Set StartDate   = qHandle(1)
             Set Status                   = qHandle(2)
             Set Data            = $$GetPlan^Ps.Plan(PlanNo, StartDate, Status)
             Set AtEnd                   = $ListGet(Data,1)
             Set Row             = $ListGet(Data,2)
             Set qHandle(0) = $ListGet(Data,3)
             Set qHandle(1) = $ListGet(Data,4)
             Set qHandle(2) = $ListGet(Data,5)
             Quit $$$OK
    }

    .mac文件部分:

    query逻辑:

    启动:传入StartDate和Status,PlanNo为空,根据Status和IdxA由后向前找到第一条数据的StartDate进入while循环:目的是在不传出有效数据的情况下不必跳出Fetch

    过程:判断StartDate是否符合条件,若不符合跳出并终止Fetch根据IdxA, Status, StartDate找到一条数据并设定PlanNo判断PlanNo不为空的时候,进行查找和传出数据;否则按照之前的方法查找下一条数据并再次进入循环传出AtEnd值(0可以继续进入Fetch,1终止Fetch), Row(返回的列表), PlanNo, Status, StartDate根据这三者查找下一条数据

    GetPlan(PlanNo, StartDate, Status) Public
    {                 
    
             If (PlanNo '= "")
             {
                       Goto Next
             }
    
    // -1表示从后向前查找,因为该函数的目的是找时间最近的,因此从后向前查找会避免很多问题
             Set StartDate = $Order(@$$$PsPlanI@("IdxA", Status, StartDate), -1)
             
             While (StartDate '= "")
             {        
                       
                       If (StartDate < 20150926)
                       {
                                Goto Exit
                       }
    
    Next 
                       Set PlanNo = $Order(@$$$PsPlanI@("IdxA", Status, StartDate, PlanNo), -1)
                       If (PlanNo '= "")
                       {
                                Set Data            = $Get(@$$$PsPlanD@(PlanNo)) 
                                Set PatientId    = $ListGet(Data, $$$PsPlanPatientId)
                                Set StartDate   = $ListGet(Data, $$$PsPlanStartDate)
                                Set EndDate     = $ListGet(Data, $$$PsPlanEndDate)
                                Set Module                = $ListGet(Data, $$$PsPlanModule)
                                Set Status                   = $ListGet(Data, $$$PsPlanStatus)
                                Set DoctorId    = $ListGet(Data, $$$PsPlanDoctorId)
                       
                                Set Row             = $ListBuild(PlanNo, PatientId, StartDate, EndDate, Module, Status, DoctorId)
             
                                Set AtEnd                   = 0
                                Goto Exit
                       }
                       
                       Set StartDate = $Order(@$$$PsPlanI@("IdxA", Status, StartDate), -1)
             }
                                         
    Exit  
        Set Ret = $ListBuild(AtEnd, Row, PlanNo, StartDate, Status)
             Quit Ret
    }

    Query 的测试方法写在routine中,

    // do TestGetPlan^Ps.Plan()
    TestGetPlan() Public
    {
             Set rs = ##Class(%ResultSet).%New("Ps.Plan:GetPlan")
             do rs.Execute(4, 20160926)
             While rs.Next()
             {
                       w " PlanNo"_rs.GetData(1)_" StartDate"_rs.GetData(3)_" Status"_rs.GetData(6),!
             }
             do rs.Close()
             Kill rs
             Quit
    }

    需要注意的是,非主键的属性作为索引时,在I表里小写会自动转成大写;非必需的属性作为索引,在I表里会自动在前面加一个空格。这里我自己的推测是在索引时,非必需的属性可能为空,而在routine中,是要根据这个属性进行索引的,为防止可能为空的数据无法被索引到,会自动在前面加一个空格。因此在写query的routine时,要注意在编码时加空格匹配;在test时,要注意大小写和空格的问题。

     ===================================================

    重建索引表:

    正常输入数据后,数据存放在D表中,而query在查找数据时,会使用索引表(I表)。I表是根据D表和cls文件中的设置建立起来的

    Management portal/system explorer/SQL

    更改命名空间,打开左侧的Tables下拉栏,找到需要重建的表名

    在右侧可以看到基本信息,找到上面的Action/rebuild indices即可建立I表

     

    另外open table可以查看当前表的所有内容,在当前页的最下方可以调节显示数据的条数

     ==========================================================

    Management portal简介:

    除了上述的System Explorer/SQL外,常用的还有System Explorer/Globals用于导入导出数据和查看表格;System Operation进行配置;System Administration进行管理等

     ==========================================================

    远程访问Ensemble:

    首先关闭防火墙才能被其他服务器远程访问。

    访问其他服务器时,首先进行配置。

    左键右下角图标,Prefered Server/AddEdit…

     

    Localhost这一行可以看到自己的Port/Web Server Port配置情况,点击Add添加其他服务器IP地址、端口和网络端口保存

     

    再查看prefered server即可看到当前的首选服务器,在remote system access里可以打开任意可以远程到的服务器的studio/terminal/management portal/documentation

  • 相关阅读:
    第四章 分布式扩展
    第三章 2.性能压测,容量问题
    第三章 1.云部署,打包上传
    MySQL语法大全
    Python随手记
    Python操作Mysql中文乱码问题
    Python基础函数
    破解电信校园网路由限制
    ThinkPHP扩展函数的三个方法
    $_SERVERS预定义变量
  • 原文地址:https://www.cnblogs.com/gyjerry/p/5954552.html
Copyright © 2011-2022 走看看