我需要在表函数中使用动态sql的帮助

时间:2018-12-26 19:28:30

标签: sql oracle

我正在使用带有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查询查看结果列表。

谢谢。

1 个答案:

答案 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