SQL function 在GSP中用TFunctionCall类表示。所有的function都用这个类表示。
TFunctionCall中的基本信息
一般的SQL function的语法如下:
funcName(arg1,arg2)
TFunctionCall中对应属性值:
getFunctionName() = funcName
getArgs().size() = 2
getArgs().getExpression(0) = arg1
getArgs().getExpression(1) = arg2
getFunctionType() = unknown_t
目前 getFunctionType()
表示的函数类型并不完善,用它来判断函数并不一定准确,需小心。
不规则参数的函数
一般情况下,函数的参数由TExpressionList getArgs()
获得,这些函数的参数形如:
funcName(arg1,arg2,arg3)
其中,arg1
,arg2
,arg3
的类型都是表达式:TExpression
。
但有一些函数的参数并不能仅仅由表达式来表示,例如cast
函数,
SELECT CAST(ytd_sales AS CHAR(5)) FROM titles
除了ytd_sales
可以用TExpression
,还有AS
关键字和CHAR(5)
数据类型,所以cast
函数
的参数不能用TExpressionList getArgs()
获得,它对应的参数分别为:
getExpr1() = ytd_sales
getTypename() = CHAR(5)
函数的参数语法上的多样性,导致获取参数的API方式的不统一。以后API上可能需要改进以保证获取参数方法统一。
其它参数不规则的函数另行补充.
判断一个函数是否为数据库的内置函数(built-in funciton)
- 判断该函数是否为某一数据库的内置函数。
EDbVendor
用来指定数据库厂商,例如db2
,oracle
等。public boolean isBuiltIn(EDbVendor pDBVendor)
- 静态函数,需指定函数名。功能同1.
public static boolean isBuiltIn(String pName, EDbVendor pDBVendor)
aggregate function
1. ALL | DISTINCT
getAggregateType()
is used to determine the ALL | DISTINCT
used in the aggregate function.
2. WITHIN GROUP
This information is not available in the TFunctionCall yet.
window function
FUNCTION_NAME(expr) OVER {window_name | (window_specification)}
在Oracle and SQL Server中,window_specification
也称为window_clause
。
在GSP中,用TWindowDef
表示window_specification
, 在TFunctionCall
中,用以下方法获得window_specification
public TWindowDef getWindowDef()
以这个包含window function的SQL为例:
SELECT NUM, ODD,
CUME_DIST( ) OVER(PARTITION BY ODD ORDER BY NUM) cumedist
FROM test4
GSP的输出为:
sstselect
--> function: CUME_DIST, type:unknown_t
window_specification
Parition value: ODD
Order by clause: NUM
CASE FUNCTION
用TCaseExpression
表示。