如果是varchar2如何执行动态sql
Posted
技术标签:
【中文标题】如果是varchar2如何执行动态sql【英文标题】:How can execute dynamic sql if it is varchar2 【发布时间】:2018-02-22 11:15:10 【问题描述】:我有 PL/SQL 函数,它动态创建选择语句并将此语句返回为 varchar。因为我需要此语句动态工作(每次返回不同的列数/名称)。例如它可以返回此选择
'select id,name,currency,note from tabel t where t.id in(1,2,3,4,5,6);'
而且我还有另一个函数必须使用这个select语句的结果。 但是第二个 select 语句返回这个字符串,不能执行这个 select 语句。
如何让第一个函数返回结果为sql?
【问题讨论】:
使用 ExecuteImmediate? docs.oracle.com/cd/B19306_01/appdev.102/b14261/… 执行此查询的函数是否知道结果(列)的结构? 删除了我的答案!!!我只把它读成 SQL :( 如果每次都能得到不同的列数/名称,调用函数将如何处理结果?那已经是动态的了吗(我猜是使用dbms_sql
)?更多上下文将有助于了解您实际尝试做的事情以及合适的方法。
我问的是必须使用 select 语句结果的函数,而不是如何生成该字符串。您最终将如何处理查询结果?
【参考方案1】:
只要调用者知道结果的结构:
CREATE OR REPLACE PROCEDURE execute_query(query IN VARCHAR2)
TYPE cur_typ IS REF CURSOR;
c cur_typ;
ID NUMBER;
Name VARCHAR2(20);
Currency VARCHAR2(20);
Note VARCHAR2(200);
BEGIN
OPEN c FOR query;
LOOP
FETCH c INTO ID, Name, Currency, Note;
EXIT WHEN c%NOTFOUND;
....
END LOOP;
CLOSE c;
END;
/
【讨论】:
这个很好的代码,但对我不起作用 :) 正如我上面所说,我不知道有多少列来自我的动态查询。如果此列计数为静态,它将像您的程序一样。 @BahruzAghalarov 你想对动态查询的结果游标做什么? 此功能必须在 Apex 交互式网格中显示此结果。第二个函数我将此结果添加到集合中并为列提供标题。【参考方案2】:使用 立即执行语句
如文档中所述: https://docs.oracle.com/cd/B13789_01/appdev.101/b10807/13_elems017.htm
【讨论】:
@BlindSniper 评论不是答案 避免链接答案。您可以在此处提供链接作为参考并在此处发布关键部分,例如语法/详细信息。否则你会吸引反对票。 @PrabhatG 谢谢指教,以后会更加小心以上是关于如果是varchar2如何执行动态sql的主要内容,如果未能解决你的问题,请参考以下文章