0

以下に示すような機能があります。パラメータを使用して実行する必要があるため、クエリ文字列があります。私の問題は次のとおりです。「for」内にクエリを配置するにはどうすればよいですか? 私は試してみました

EXECUTE IMMEDIATE query_string 

私のforループでは動作しません。

誰?

よろしく!

create or replace FUNCTION RO_FUN_TOTAL_SCORE_DATE_PORTAL
(
  v_DATE_FIELD  IN VARCHAR2
) RETURN RO_OBJ_NESTED_TOTAL_SCORE IS
  v_ret               RO_OBJ_NESTED_TOTAL_SCORE;
  query_string       VARCHAR2(1000);
BEGIN
  /*Initialize object type to save data*/
  v_ret := RO_OBJ_NESTED_TOTAL_SCORE();

  query_string := 'SELECT ROUND(AVG(generic_score),2) AS score,
    yrp.comment_date_pk AS comment_date,
    yrp.hot_id_pk AS hot_id,
    yp.portal_id_pk AS portal_id,
    AVG(total_opinions) AS total_opinions
   FROM yrportalreview yrp JOIN yrhotellinks yrh ON yrp.hot_id_pk =
    yrh.hot_id
    AND yrp.portal_id_pk = yrh.portal_id AND yrp.comment_date.pk = ' ||    
    v_DATE_FIELD || 
  ' WHERE yrp.hot_id_pk IN (92, 27)
    AND concept_id_pk = 1
    AND yp.active = 1
   GROUP BY hot_id_pk,
    yp.portal_id_pk,
    yrp.comment_date_pk';

FOR I IN (EXECUTE IMMEDIATE query_string)
  LOOP
    /*insert in table type rows with data*/
    v_ret.extend;
    v_ret(v_ret.count) := RO_OBJ_TOTAL_SCORE_DATE_PORTAL(i.score, 
      i.comment_date, i.hot_id, i.portal_id, i.total_opinions);
  END LOOP;
  RETURN v_ret;
END RO_FUN_TOTAL_SCORE_DATE_PORTAL;
4

2 に答える 2

0

データをクエリに連結しないでください。バインド変数を使用します。SQL インジェクションとハード解析を読んで、バインド変数を使用する必要がある 2 つの理由を確認してください。

次のようなことを試すことができます (ループはまったく必要ありません)。

  create or replace FUNCTION RO_FUN_TOTAL_SCORE_DATE_PORTAL
  (
    v_DATE_FIELD  IN VARCHAR2
  ) RETURN RO_OBJ_NESTED_TOTAL_SCORE IS
    v_ret               RO_OBJ_NESTED_TOTAL_SCORE;

  BEGIN

    SELECT RO_OBJ_TOTAL_SCORE_DATE_PORTAL
              (ROUND(AVG(generic_score),2)  -- score,
              ,yrp.comment_date_pk          -- comment_date
              ,yrp.hot_id_pk                -- hot_id
              ,yp.portal_id_pk              -- portal_id
              ,AVG(total_opinions))         -- total_opinions
    BULK COLLECT INTO v_ret
     FROM yrportalreview yrp 
     JOIN yrhotellinks yrh 
           ON yrp.hot_id_pk = yrh.hot_id
           AND yrp.portal_id_pk = yrh.portal_id 
           AND yrp.comment_date.pk = v_DATE_FIELD 
     WHERE yrp.hot_id_pk IN (92, 27)
      AND concept_id_pk = 1
      AND yp.active = 1
     GROUP BY hot_id_pk,
      yp.portal_id_pk,
      yrp.comment_date_pk';

    RETURN v_ret;
  END RO_FUN_TOTAL_SCORE_DATE_PORTAL;
于 2015-07-06T22:38:02.253 に答える