通过直接数据库请求中的表示变量传递多个值
Posted
技术标签:
【中文标题】通过直接数据库请求中的表示变量传递多个值【英文标题】:Passing multiple values through a Presentation Variable in a Direct Database Request 【发布时间】:2019-12-09 15:59:04 【问题描述】:我在 OBIEE 中创建了多个直接数据库请求,我能够将表示变量传递给仪表板提示。但是,我只能选择一个值,如果我选择多个值,则会收到一条错误消息,提示找不到结果。我在 Oracle 社区对此进行了研究,但尚未找到解决方案,我发现所有类似的问题仍未得到解答。
当我选择多个值时,我注意到它们被作为一个长字符串传递。例如。
GL_Period IN ('APR-19,AUG-19,FEB-19,JAN-19,JUL-19,JUN-19,MAR-19,MAY-19,NOV-19,OCT-19,SEP-19')
每个值都有开头和结尾的引号,而不是引号。
我的问题是任何人都可以帮助我得到这个提示以接受多个值。我试图更新仪表板提示后面的 SQL,我的想法是,如果我将 ' 连接到每个值的开头和结尾。然后修剪第一个和最后一个'关闭,这将起作用。但是,如果可能的话,我一直无法获得正确的语法。
这是我的直接数据库请求中的表示变量的代码
AND (
gl_period_name IN ('@P_Period')
OR 'All' IN ('@P_PeriodAll'))
我可以使用以下代码为每个值添加 ' ' - 这是用于表示变量 P_Period
SELECT CHAR (39)||"Time"."Fiscal Period"||CHAR (39) FROM "Financials - AP Transactions")
我尝试了以下查询以将两者结合起来,但无济于事
TO_CHAR(TRIM(BOTH ''' FROM SELECT CHAR (39)||"Time"."Fiscal Period"||CHAR (39) FROM "Financials - AP Transactions"))
【问题讨论】:
【参考方案1】:使用 gl_period_name IN (@P_Period['@']'') 传递多个值。 唯一的问题是,如果没有传递任何值,这将不会给你任何结果(我还没有想出如何解决这个问题)。
【讨论】:
【参考方案2】:您可以使用递归 CTE 将逗号分隔的字符串转换为多个值
WITH CTE AS (SELECT 'APR-19,AUG-19,FEB-19,JAN-19,JUL-19,JUN-19,MAR-19,MAY-19,NOV-19,OCT-19,SEP-19' TEMP FROM DUAL)
SELECT TRIM(REGEXP_SUBSTR( TEMP, '[^,]+', 1, LEVEL)) Period FROM CTE
CONNECT BY LEVEL <= LENGTH(REGEXP_REPLACE(temp, '[^,]+')) + 1
用你的变量替换硬编码的字符串,把它放到你的 where 子句中的子查询中,你会很高兴的。像这样的:
select 1 TEST
from dual
where 'APR-19' IN (WITH CTE AS (SELECT 'APR-19,AUG-19,FEB-19,JAN-19,JUL-19,JUN-19,MAR-19,MAY-19,NOV-19,OCT-19,SEP-19' TEMP FROM DUAL)
SELECT TRIM(REGEXP_SUBSTR( TEMP, '[^,]+', 1, LEVEL)) Period FROM CTE
CONNECT BY LEVEL <= LENGTH(REGEXP_REPLACE(temp, '[^,]+')) + 1)
【讨论】:
以上是关于通过直接数据库请求中的表示变量传递多个值的主要内容,如果未能解决你的问题,请参考以下文章