Oracle 无法在存储过程中运行大型动态选择查询

Oracle 无法在存储过程中运行大型动态选择查询,oracle,plsql,oracle11g,Oracle,Plsql,Oracle11g,我有一个正在执行动态选择查询的存储过程。查询字符串很大。以下是存储过程 create or replace procedure My_SP ( procRefCursor out sys_refcursor, --My other input variables here ) is dynSqlComplete varchar2(8000) := 'n/a'; begin dynSqlComplete := 'Large query here'; open procRefCurs

我有一个正在执行动态选择查询的存储过程。查询字符串很大。以下是存储过程

create or replace procedure My_SP ( procRefCursor out sys_refcursor, --My other input variables here ) is dynSqlComplete varchar2(8000) := 'n/a'; begin dynSqlComplete := 'Large query here'; open procRefCursor for dynSqlComplete; end;
你确定不想要函数吗?这是我做的一个类似的例子

FUNCTION showbody(cust varchar2, receipt varchar2) 
    RETURN sys_refcursor AS retval sys_refcursor;
BEGIN
    OPEN retval FOR
        SELECT * 
        FROM comp.comp_remittance_details
        WHERE receipt_number=receipt 
            AND customer_number=cust;
    RETURN(retval);
END showbody;

您可以尝试在11g中使用clob a clob,类似(未测试):


你的DBA怎么说?相当确定的是,ora 600可能需要Oracle支持才能充实。如果您打印生成的SQL语句(即
dbms\u output.put\u line(dynSqlComplete))
在打开光标然后尝试手动执行该语句之前,该语句是否有效?如果有效,则您已将问题缩小到调用
打开
。如果无效,则问题在于SQL语句本身或您生成的SQL语句格式不正确。@Justin,我已尝试dbms\u output.put\u line(dynSqlComplete),事实上,我尝试了dbms_输出。在分配大查询之前放置_行('hi'),但它没有显示。我认为它在此之前失败了。但当我减小varchar2大小并执行时,它显示“hi”,然后字符串缓冲区错误出现。@tbone,我的项目中没有DBA:(您正在使用什么工具?例如,在SQLPlus中,您需要
将serveroutput设置为on
,以便告诉SQLPlus为
dbms\u输出创建一个缓冲区,以便写入和读取缓冲区并显示数据。如果您甚至无法打印“hi”一词,这意味着您的工具尚未配置为显示
dbms\u output
的输出。您还可以将SQL语句写入数据库表,并在代码运行后查看查询。不行,请执行立即执行varchar2,clob将导致
PLS-00382:表达式的类型错误
。除非在在10gR2和11g之间。@tbone,会给它一个机会,让你知道。谢谢。@ShannonSeverance-是的,它在11g中发生了一些变化:@ShannonSeverance是11g的一个新功能,它实际上在类似的情况下救了我(DW项目)在这里,我需要动态创建一个包含许多分区的表。我也习惯了10g varchar限制,但对于11g,我感到非常惊讶。
FUNCTION showbody(cust varchar2, receipt varchar2) 
    RETURN sys_refcursor AS retval sys_refcursor;
BEGIN
    OPEN retval FOR
        SELECT * 
        FROM comp.comp_remittance_details
        WHERE receipt_number=receipt 
            AND customer_number=cust;
    RETURN(retval);
END showbody;
declare
  l_sql clob;
  l_str1 varchar2(32767);
  l_str2 varchar2(32767);
begin
  dbms_lob.createtemporary(l_sql, false);

  l_str1 := 'some large SQL chunk';
  l_str2 := 'and the rest of large SQL chunk';

  l_sql := l_str1;
  dbms_lob.writeappend(l_sql, length(l_str2), l_str2);

  execute immediate l_sql;

  dbms_lob.freetemporary(l_sql);

end;