如果是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的主要内容,如果未能解决你的问题,请参考以下文章

pl/sql 函数 - 为 SELECT ... NOT IN() 动态传递多个 varchar2 值

PL/SQL:clob 字符串中的动态查询。如何打开游标?

oracle sql中的动态数据透视

oracle sql中的动态数据透视

是否可以创建动态 varchar2 变量?

表格中的属性名称 varchar2