0

我有一个将 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 语句 - 但是我希望执行这个 SQL。

这是这个问题的延伸。

我尝试使用 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;
4

1 回答 1

0

匿名 PL/SQL 块不能将任何数据返回给调用者。如果要将 a 返回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 语句。我没有在这里做那个改变。

在调用从 SSRS返回 a 的存储函数时sys_refcursor,还有另一个 StackOverflow 线程。

于 2012-06-24T06:25:24.180 回答