我正在使用带有oracle后端的第三方应用程序。
我正在尝试存储SQL,然后将其传递到数据库并显示结果列表。
问题在于,当应用程序查询数据库时,它将所有单引号变成双单引号。 (从双选中选择“ x”成为从双选中选择“ x”) 因此,我以为我可以建立一个表函数来去除多余的单引号并执行查询,但是我遇到了问题。
create or replace type DSQLMenu_Record as object
(
label varchar2(255),
value varchar2(255)
)
;--------------------------------------------------------------------
create or replace type DSQLMenu_Table as table of DSQLMenu_Record
;--------------------------------------------------------------------
create or replace function F_DSQLMenu (V_IN_QUERY in varchar2)
return DSQLMenu_Table as
V_RESULTS DSQLMenu_Table;
V_PARSED_QUERY VARCHAR2(8000);
begin
V_PARSED_QUERY := replace(V_IN_QUERY,'''''','''') ;
select
DSQLMenu_Record(label, value)
bulk collect into
V_RESULTS
from
(
execute immediate V_PARSED_QUERY;
);
return V_RESULTS;
end F_DSQLMenu;
如果它正在执行我想要的操作,则用户将单击应用程序中的下拉菜单,并根据传入的sql查询查看结果列表。
谢谢。
答案 0 :(得分:0)
感谢您提供其他详细信息。我认为您需要稍微更改一下选择....
有关正确的语法,请参见https://docs.oracle.com/cd/B12037_01/appdev.101/b10807/11_dynam.htm。
因此,需要遵循以下内容(没有要测试的环境)
V_PARSED_QUERY := 'select DSQLMenu_record(label, value) from (' || v_parsed_query || ')';
execute immediate v_parsed_query bulk collect into v_results;
更新
回答您的评论。...我不确定为什么您会获得一条记录。按照下面的代码片段,我正确地获得了两条记录
declare
type DSQLMenu_Table is table of DSQLMenu_Record;
V_RESULTS DSQLMenu_Table;
V_PARSED_QUERY VARCHAR2(8000) := 'select ''The Test Value A'' thelabel, ''TestValA'' thevalue, 1 thesort from dual union select ''The Test Value B'' thelabel, ''TestValB'' thevalue, 2 thesort from dual order by thesort';
begin
V_PARSED_QUERY := 'select DSQLMenu_Record(thelabel, thevalue) from (' || v_parsed_query || ')';
dbms_output.put_line(v_parsed_query);
execute immediate v_parsed_query bulk collect into v_results;
dbms_output.put_line(v_results.count);
for i in v_results.first..v_results.last loop
dbms_output.put_line(v_results(i).label);
end loop;
end;
dbms输出结果是
select DSQLMenu_Record(thelabel, thevalue) from (select 'The Test Value A' thelabel, 'TestValA' thevalue, 1 thesort from dual union select 'The Test Value B' thelabel, 'TestValB' thevalue, 2 thesort from dual order by thesort)
2
The Test Value A
The Test Value B