Oracle PL/SQL函数体从视图返回SQL查询

Oracle PL/SQL函数体从视图返回SQL查询,oracle,plsql,oracle-apex,oracle-apex-19.1,Oracle,Plsql,Oracle Apex,Oracle Apex 19.1,我正在尝试生成一些更复杂的东西。为了避免有太多的查询和维护点,我们的想法是使用视图 create or replace view vw_teste as Select 1 from dual where 1 = '#VARIABLE_FIX'; 我想做的是 DECLARE sQuery VARCHAR2(32767); sView VARCHAR2(32767); BEGIN SELECT a.TEXT into sView FROM all_views a where a.VIEW_

我正在尝试生成一些更复杂的东西。为了避免有太多的查询和维护点,我们的想法是使用视图

create or replace view vw_teste as
Select 1 
from dual
where 1 = '#VARIABLE_FIX';
我想做的是

DECLARE

sQuery VARCHAR2(32767);
sView VARCHAR2(32767);
BEGIN

SELECT a.TEXT
into sView
FROM all_views a 
where a.VIEW_NAME = 'VW_TESTE';

sQuery := REPLACE(sView, '''#VARIABLE_FIX''', :P1_ITEM);

return(sQuery);

END;
返回的错误:

ORA-20999:在ORA-20999:中解析返回的查询结果失败 解析SQL查询 ORA-06550:第12行第23列:ORA-00936:缺失 表情

我甚至将变量sQuery的内容插入到一个临时表中,结果与视图的内容一致

我使用了参数化视图,但是当我直接在OracleApex中返回查询时,报告的性能要快得多

如果您传递Squery:=“从dual中选择1,其中1=:P1_项”,则返回成功。关于如何绕过错误并使用此方法,您有什么想法吗?

您的陈述

sQuery := REPLACE(sView, '''#VARIABLE_FIX''', :P1_ITEM);
有太多的引号-没有必要转义引号,因为您的视图定义中已经有了引号。将该行替换为

sQuery := REPLACE(sView, '#VARIABLE_FIX', :P1_ITEM);
你可以走了。已于19.1验证。 然而,我可能会使用Dan的解决方案,将查询放在一个包含函数的包中。这比在数据字典中查询视图定义要透明得多。

您的语句

sQuery := REPLACE(sView, '''#VARIABLE_FIX''', :P1_ITEM);
有太多的引号-没有必要转义引号,因为您的视图定义中已经有了引号。将该行替换为

sQuery := REPLACE(sView, '#VARIABLE_FIX', :P1_ITEM);
你可以走了。已于19.1验证。
然而,我可能会使用Dan的解决方案,将查询放在一个包含函数的包中。这比查询数据字典中的视图定义要透明得多。

我的第一个猜测是,您正在用输入的参数替换变量\u FIX,而您没有提供该参数。尝试在replace中使用“:P1\u ITEM”而不是:P1\u ITEM似乎在解决问题方面走了很长的路,这可能会带来性能问题和SQL注入风险。你到底想解决什么问题?使用sys_context可以解决这个问题吗?从没有所有者的所有_视图中选择代码还有另一个问题,可能会导致重复值ORA-01422:exact fetch返回的行数超过请求的行数。通常,使用视图有助于简化业务逻辑,公共联接等是好的。但是,就我个人而言,我认为你试图做的是过度优化和潜在的限制。返回SQL查询的PL/SQL函数受支持,而传统报表支持通用列,交互式报表不支持通用列,并且完全不支持交互式网格、LOV等。使用这种灵活性时,技术负担和复杂性成本可能超过任何好处。此外,在包含函数的包上使用视图的好处是什么?这些函数根据输入返回SQL查询。我的第一个猜测是,您正在使用未提供的输入参数替换变量_FIX。尝试在replace中使用“:P1\u ITEM”而不是:P1\u ITEM似乎在解决问题方面走了很长的路,这可能会带来性能问题和SQL注入风险。你到底想解决什么问题?使用sys_context可以解决这个问题吗?从没有所有者的所有_视图中选择代码还有另一个问题,可能会导致重复值ORA-01422:exact fetch返回的行数超过请求的行数。通常,使用视图有助于简化业务逻辑,公共联接等是好的。但是,就我个人而言,我认为你试图做的是过度优化和潜在的限制。返回SQL查询的PL/SQL函数受支持,而传统报表支持通用列,交互式报表不支持通用列,并且完全不支持交互式网格、LOV等。使用这种灵活性时,技术负担和复杂性成本可能超过任何好处。此外,在包含返回基于输入的SQL查询的函数的包上使用视图有什么好处?