PLSql возвращаемые значения - PullRequest
3 голосов
/ 14 октября 2010

Здесь я снова перейду к некоторому PLSql ..

Я хочу знать, если есть какой-то способ, я могу использовать следующую функцию как выбор, не превращая ее в функцию или процедуру (чтобы я могсм. код из скрипта, в котором он содержится).

Код будет выглядеть так:

DECLARE
    outpt  VARCHAR2(1000) := ''; 
    flow_rI  VARCHAR2(50); 
    CURSOR flow_r IS
      select flow_run_id
        from table
        where CREATED_DATE < sysdate - 32
        and rownum < 10
        order by 1 desc;
BEGIN 
    OPEN flow_r;
    LOOP 
        FETCH flow_r INTO flow_rI; 
        EXIT WHEN flow_r%notfound; 
        BEGIN 
            outpt := outpt ||  ',' || flow_rI;
        EXCEPTION 
            WHEN no_data_found THEN 
              dbms_output.Put_line(outpt); 
        END; 
    END LOOP;
    dbms_output.Put_line(outpt); 
    outpt := '';
    CLOSE flow_r;
END;

Идея проста, я просто хочу получить серию кодов из моего table но с результатами, отформатированными как "1234,2434,424,45,767,43", а не с таблицей в результате запроса.Позже он будет использоваться в коде для различных целей, включая другие запросы, в которых я мог бы просто выполнить in ([variable with that string]).

. Дело в том, что при использовании dbms_output.Put_line(outpt); я не могу получить к нему доступ со своего прикладного уровня икажется, что в plsql я не могу использовать return, не превратив его в функцию.

У кого-нибудь есть идея?Это не обязательно должен быть такой же PlSql, пока я могу иметь весь код в скрипте.

спасибо!

f.

Ответы [ 3 ]

9 голосов
/ 14 октября 2010

Почему бы не использовать только sql:

   SELECT MAX(ltrim(sys_connect_by_path(flow_run_id, ','), ','))
   FROM
   (
    select flow_run_id, rownum rn
    from table
    where CREATED_DATE < sysdate - 32
    and rownum < 10
    order by 1 desc
   )
   START WITH rn = 1
   CONNECT BY PRIOR rn = rn - 1
1 голос
/ 14 октября 2010

если вы используете Oralce 11 r2, вы можете использовать LISTAGG, чтобы сделать именно это http://download.oracle.com/docs/cd/E14072_01/server.112/e10592/functions087.htm

, но на этом сайте есть, как вы можете сделать это в любой версии (но вам нужно быть> = 9i, чтобы сделатьэто в чистом SQL с идеальным 11r2): http://www.oracle -base.com / article / misc / StringAggregationTechniques.php (особенно посмотрите на функции ROW_NUMBER () и SYS_CONNECT_BY_PATH в Oracle 9i для чистого SQL)1007 *

0 голосов
/ 14 октября 2010

Другой вариант - определить некоторые переменные ввода / вывода и вместо return назначить значение результата для выходной переменной.

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