PL / SQL Select внутри цикла - PullRequest
0 голосов
/ 07 мая 2018

У меня есть оператор PL / SQL, который должен выполнить итерацию оператора SELECT, выполнить хранимую процедуру и затем выбрать что-то из таблицы.

Заявление выглядит так, как показано ниже:

BEGIN
    FOR r IN (
        select org_id ,name from table2 order by 1
    ) LOOP

        dbms_application_info.set_cl (r.org_id);
        Select prj_id, prj_name 
        INTO l_output
        FROM table1
        WHERE CREATION_DATE>TO_DATE('10/01/2017','DD-MM-YYYY');   
        dbms_sql.return_result(l_output); --error     
    END LOOP;
END;

Я не знаю, как отобразить все строки, возвращаемые запросом. Может ли кто-нибудь попытаться помочь мне понять это? Я искал решение, но безуспешно до сих пор ..

PS: Table1 - это представление, которое должно инициировать хранимую процедуру перед выбором

Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 07 мая 2018

Процедура dbms_sql.return_result принимает / возвращает курсор ref, вам нужно открыть курсор ref перед вызовом этой процедуры:

    DECLARE
      l_output sys_refcursor;    
    BEGIN
      FOR r IN (SELECT org_id,
                       NAME
                  FROM table2
                 ORDER BY 1) LOOP

        dbms_application_info.set_cl(r.org_id);
        OPEN l_output FOR
          SELECT prj_id,
                 prj_name
            FROM table1
           WHERE creation_date > to_date('10/01/2017', 'DD-MM-YYYY');
        dbms_sql.return_result(l_output);
      END LOOP;
    END;
0 голосов
/ 07 мая 2018
BEGIN
    FOR r IN (select org_id ,name from table2 order by 1)
       LOOP
          dbms_application_info.set_cl (r.org_id);
         for x in (Select prj_id, prj_name
                    FROM table1
                   WHERE CREATION_DATE>TO_DATE('10/01/2017','DD-MM-YYYY'))
            loop   
              dbms_output.put_line('prj_id:  '||x.prj_id ||'  prj_name:  '||x.prj_name );
         end loop;     
    END LOOP;
END;
0 голосов
/ 07 мая 2018

Так, может быть, использовать ту же конструкцию, что и во внешнем запросе?

BEGIN
    FOR r IN (
        select org_id ,name from table2 order by 1
    ) LOOP

        dbms_application_info.set_cl (r.org_id);

        FOR inner_query IN (
          Select prj_id, prj_name 
          FROM table1
          WHERE CREATION_DATE>TO_DATE('10/01/2017','DD-MM-YYYY');   
        ) LOOP
          dbms_output.put_line('prj_id: ' || inner_query.prj_id || ' prj_name:' || inner_query.prj_name);
        END LOOP;  
    END LOOP;
END;

Edit: Если вы хотите неявно вернуть курсор из вашей процедуры через dbms_sql.return_result, вы должны объявить переменную как ref_cursor:

l_output SYS_REFCURSOR

А затем откройте его для вашего запроса:

 OPEN l_output FOR SELECT ...

И, наконец, вернитесь со следующей процедурой:

 DBMS_SQL.RETURN_RESULT(l_output);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...