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 、currs、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ブロックは、呼び出し元にデータを返すことはできません。呼び出し元のアプリケーションに戻りたい場合は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ステートメントを返すクエリから1行だけをフェッチしています。SELECTステートメントが1行を返すことだけを期待しているので、1つだけをフェッチすると仮定しています。それ以外の場合、クエリにはがないためORDER BY、コードが生成しているN個のSQLステートメントの1つを任意に実行しています。

このメソッドを定期的に呼び出す場合は、file_id共有不可能なSQLステートメントを生成するのではなく、動的SQLステートメントでバインド変数を使用することをお勧めします。ここではその変更を加えていません。

SSRSからを返すストアド関数sys_refcursorを呼び出す際の別のStackOverflowスレッドがあります。

于 2012-06-24T06:25:24.180 に答える