如何在PeopleCode中获取SQL对象的列名?

问题描述 投票:2回答:1

我有一个iscript,它运行先前创建的SQL语句的集合之一,绑定多个参数,并生成XML结果。

每个请求中使用的SQL的参数数量和返回的列(和名称)数都不同。

除了一个突出的问题外,一切都很容易开发:如何收集列名并将该信息包含在返回的数据中?

当前,我们正在使用CreateSQL命令和一个SQL对象。据我所知,我们只能遍历结果值,而不能浏览列名和值的字典。

在iscript的上下文中,如何使用(本质上)无法提前知道的动态SQL返回带有PeopleCode中结果的列名称?

oracle peoplesoft peoplecode
1个回答
0
投票
但是,如果您自己创建SQL对象并乐于应用一些一致的规则,则可以直接通过直接解析SQL文本以获取字段名称来走很长一段路。

这是使用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"]
© www.soinside.com 2019 - 2024. All rights reserved.