我有一个查询,它将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;
答案 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线程。