8.CacheScript 与SQL

一、嵌入式SQL

1.新增与更新

/// Creator:      	邓体进
/// CreatDate:    	2022-03-01
/// Description: 	插入或更新数据
/// Table:        	DHCCLDemo.Student
/// Input:			id:ID,name:姓名,age:年龄
/// Return:       	ResultSet
/// w ##class(DHCCLDemo.BLL.Sample).SaveBySQL("", "王二", 23)
ClassMethod SaveBySQL(id, name, age)
{
	/// 错误示例:w ##class(DHCCLDemo.BLL.Sample).SaveBySQL("", "王二", "王二")
	if (##class(DHCCLDemo.Student).%ExistsId(id))
	{
		&sql(update DHCCLDemo.Student(Name, Age, Sex, epartment, Address, Birthplace)
		VALUES (:name, :age, NULL, NULL, NULL, NULL) 
		where RowId=:id)
	}
	else
	{
		&sql(INSERT INTO DHCCLDemo.Student (Name, Age, Sex, epartment, Address, Birthplace)
		VALUES (:name, :age, NULL, NULL, NULL, NULL))
	}
	
	if (SQLCODE=0)
	{
		return "S^"_%ROWID
	}
	else
	{
		return "E^"_%msg
	}
}

2.查询

/// Creator:      	邓体进
/// CreatDate:    	2022-03-01
/// Description: 	使用嵌入式SQL查询数据
///                 优点: 速度较快 ,缺点:同一文件游标不能重复
/// Table:        	DHCCLDemo.Student
/// Input:			opsId:手术ID,moduleCode:模块代码
/// Return:       	ResultSet
/// d ##class(%ResultSet).RunQuery("DHCCLDemo.BLL.Sample","FindByEmbeddedSQL","王二")
Query FindByEmbeddedSQL(name As %String) As websys.Query(ROWSPEC = "RowId,Name") [ SqlProc ]
{
}

ClassMethod FindByEmbeddedSQLExecute(ByRef qHandle As %Binary, name As %String) As %Status
{
	Set repid=$I(^CacheTemp)
	If $g(ind)="" Set ind=1
	Set rowId=""
	
    &sql(Declare studentCursor cursor for
        select RowId, Name
        into :id,:name From DHCCLDemo.Student
        where Name=:name)
   
    &sql(Open studentCursor)
    for { 
        &sql(Fetch studentCursor)
        quit:SQLCODE 
        do Output(id,name)
    }
   
    &sql(close studentCursor)
	Set qHandle=$lb(0,repid,0)
	quit $$$OK
Output(id,name)
	set Data=$lb(id,name)
 	Set ^CacheTemp(repid,ind)=Data
 	Set ind=ind+1
	quit
}

3.常用函数

SQL语句常需要对数据格式进行调调,如日期、时间等以ODBC输出:

%ODBCOUT

官方文档:

http://127.0.0.1:57772/csp/docbook/DocBook.UI.Page.cls?KEY=RSQL_FUNCTIONS

以下列出常用的函数:

函数说明
$FIND查找
$LIST
$LISTBUILD
$PIECE
%ALPHAUP转化为大写
%EXACT截取
%MINUS减法
%OBJECT返回对象
%ODBCIN以ODBC方式输入
%ODBCOUT以ODBC方式输出
%SQLUPPER转化为大写
ABS取绝对值
ASCII字符转为int
CAST
YEAR获取年
WEEK获取周
FLOOR取整
JSON_ARRAY生成为JSON数组
JSON_OBJECT生成JSON对象
REPLACE替换

二、动态SQL

1.新增与更新

不建议使用动态SQL

2.查询

/// Creator:      	邓体进
/// CreatDate:    	2022-03-01
/// Description: 	使用动态SQL查询数据
///                 优点: 灵活 ,缺点:速度较慢,常常拼接容易出错
/// Table:        	DHCCLDemo.Student
/// Input:			opsId:手术ID,moduleCode:模块代码
/// Return:       	ResultSet
/// d ##class(%ResultSet).RunQuery("DHCCLDemo.BLL.Sample","FindByDynamicalSQL","王二")
Query FindByDynamicalSQL(name As %String) As websys.Query(ROWSPEC = "RowId,Name") [ SqlProc ]
{
}

ClassMethod FindByDynamicalSQLExecute(ByRef qHandle As %Binary, name As %String) As %Status
{
	Set repid=$I(^CacheTemp)
	If $g(ind)="" Set ind=1
	set rowId=""
	Set myquery = "SELECT RowId, Name FROM DHCCLDemo.Student where Name='"_name_"'"
    Set tStatement = ##class(%SQL.Statement).%New()
    SET qStatus = tStatement.%Prepare(myquery)
    if qStatus'=1 
    { 
       Set qHandle=$lb(0,repid,0)
       quit 
    }
    SET rset = tStatement.%Execute()
    while rset.%Next() {
	    set id=rset.%Get("RowId")
	    set name=rset.%Get("Name")
    	do Output(id,name)
    }
	Set qHandle=$lb(0,repid,0)
	quit $$$OK
Output(id,name)
	set Data=$lb(id,name)
 	Set ^CacheTemp(repid,ind)=Data
 	Set ind=ind+1
	quit
}

3.JDBC

4.ODBC

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秦剑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值