我有一个iscript,它运行先前创建的SQL语句的集合之一,绑定多个参数,并生成XML结果。
每个请求中使用的SQL的参数数量和返回的列(和名称)数都不同。
除了一个突出的问题外,一切都很容易开发:如何收集列名并将该信息包含在返回的数据中?
当前,我们正在使用CreateSQL
命令和一个SQL对象。据我所知,我们只能遍历结果值,而不能浏览列名和值的字典。
在iscript的上下文中,如何使用(本质上)无法提前知道的动态SQL返回带有PeopleCode中结果的列名称?
这是使用Java正则表达式处理的简单方法:
Function GetSqlFieldNames(&sqlText As string) Returns array of string
Local integer &patternFlags = 34; /* CASE_INSENSITIVE + DOTALL */
/* extract everything between the first 'select' and the first 'from' */
Local JavaObject &pattern1 = GetJavaClass("java.util.regex.Pattern").compile("select(.*?)from", &patternFlags);
Local JavaObject &matcher1 = &pattern1.matcher(CreateJavaObject("java.lang.String", &sqlText));
If Not &matcher1.find() Then
Error "nothing matching 'select...from' found";
End-If;
Local string &fields = &matcher1.group(1);
/* extract everything matching 'as XXXXX' followed by a comma or the end of the string */
Local JavaObject &pattern2 = GetJavaClass("java.util.regex.Pattern").compile("as\s*([\w.]+)\s*(,|\z)", &patternFlags);
Local JavaObject &matcher2 = &pattern2.matcher(CreateJavaObject("java.lang.String", &fields));
Local array of string &results = CreateArrayRept("", 0);
While &matcher2.find()
&results.Push(&matcher2.group(1));
End-While;
Return &results;
End-Function;
例如
select COMPANY as COMPANY, TO_CHAR(START_EVENT_DT, 'YYYY') AS START_YEAR FROM PS_INSTALLATION
给您:
["COMPANY", "START_YEAR"]