运行sql存储为oracle中的表中的值,并在SSRS报告中返回记录集

时间:2012-06-24 06:15:05

标签: oracle reporting-services cursor execute-immediate

我有一个查询,它将SQL语句创建为字段。我想执行此语句并在SSRS报告中返回记录集。

select 'select '||FILE_ID||' FILE_ID,'||
ltrim(sys_connect_by_path('REC_FLD_'||FIELD_NUMBER||' "'||FIELD_NAME||'"',','),',')||
' from RESPONSE_DETAILS where FILE_ID=' ||FILE_ID||';'
from (select t.*,count(*) over (partition by FILE_ID) cnt from RESPONSE_METADATA t)
where cnt=FIELD_NUMBER start with FIELD_NUMBER=1 
connect by prior FILE_ID=FILE_ID and prior FIELD_NUMBER=FIELD_NUMBER-1

这会生成一个SQL stetment - 但是我想要执行这个SQL。

这是

的扩展

Convert Rows into columns Oracle

我已经问过帮助我解决上述问题的人提供帮助 - 但是没有收到任何信息 - 不幸的是,这很紧急。因此提出新问题。道歉。

我尝试使用execute immediate,cursors,dbms_sql,但它不会产生输出。在蟾蜍上使用它。它说的是“PL / SQL程序已成功完成”

使用以下

Declare 
  sql_stmt  VARCHAR2(3000);
  l_cursor  SYS_REFCURSOR;
  TYPE RefCurTyp    IS REF CURSOR;
  v_cursor          RefCurTyp;
  CURSOR c1 is
    select 'select '||FILE_ID||' FILE_ID,'||
    ltrim(sys_connect_by_path('REC_FLD_'||FIELD_NUMBER||' "'||FIELD_NAME||'"',','),',')||
    ' from RESPONSE_DETAILS where FILE_ID=' ||FILE_ID||';'
    from (select t.*,count(*) over (partition by FILE_ID) cnt from RESPONSE_METADATA t)
    where cnt=FIELD_NUMBER start with FIELD_NUMBER=1 
    connect by prior FILE_ID=FILE_ID and prior FIELD_NUMBER=FIELD_NUMBER-1;
BEGIN
  open c1;
  FETCH C1 into sql_stmt ;
  dbms_output.put_line(sql_stmt);
  close c1; 
  EXECUTE IMMEDIATE sql_stmt;
  open v_cursor for sql_stmt;
  return l_cursor;
  close l_cursor ;
END;

1 个答案:

答案 0 :(得分:0)

匿名PL / SQL块无法向调用者返回任何数据。如果要将SYS_REFCURSOR返回给调用应用程序,则需要创建一个函数(或过程)。例如

CREATE OR REPLACE FUNCTION get_results
  RETURN sys_refcursor
IS
  l_sql_stmt  VARCHAR2(3000);
  l_cursor    SYS_REFCURSOR;
BEGIN
  select 'select '||FILE_ID||' FILE_ID,'||
          ltrim(sys_connect_by_path('REC_FLD_'||FIELD_NUMBER||' "'||FIELD_NAME||'"',','),',')||
         ' from RESPONSE_DETAILS where FILE_ID = ' ||FILE_ID||';'
    into l_sql_stmt
    from (select t.*,count(*) over (partition by FILE_ID) cnt from RESPONSE_METADATA t)
   where cnt=FIELD_NUMBER 
   start with FIELD_NUMBER=1 
 connect by prior FILE_ID=FILE_ID 
        and prior FIELD_NUMBER=FIELD_NUMBER-1;

  dbms_output.put_line(l_sql_stmt);
  open l_cursor for sql_stmt;
  return l_cursor;
END;

我假设你的代码中你希望你的SELECT语句返回一个SQL语句 - 你的代码只从一个可能返回多个SQL语句的查询中获取一行。我假设您只获取一个,因为您只希望SELECT语句返回一行。否则,由于您的查询缺少ORDER BY,因此您正在执行代码生成的N个SQL语句中的任意一个。

如果您经常要调用此方法,那么您几乎肯定希望在动态SQL语句中为file_id使用绑定变量,而不是生成不可共享的SQL语句。我没有在这里做出改变。

calling a stored function returning a sys_refcursor from SSRS上有另一个StackOverflow线程。