oracle массово собирает и читает данные

Ниже я создал процедуру для чтения всех данных из одной таблицы и заполнения ее в сетке в формате .net.

CREATE OR REPLACE PROCEDURE EVMPDADM.GETALLBATCHES_ARTICLE_57(p_batchstatus OUT XEVMPD_SUBMITTEDBATCH%ROWTYPE )
IS

 TYPE batch_status IS TABLE OF XEVMPD_SUBMITTEDBATCH%ROWTYPE  INDEX BY PLS_INTEGER;
 l_batchstatus batch_status;

BEGIN

SELECT *  BULK COLLECT INTO l_batchstatus FROM XEVMPD_SUBMITTEDBATCH ;

   FOR i IN 1..l_batchstatus.count LOOP 

    p_batchstatus:= l_batchstatus(i);

   END LOOP;

END GETALLBATCHES_ARTICLE_57;

Чтобы проверить, работает ли процесс нормально, я попытался распечатать данные, используя приведенный ниже блок Pl-sql:

DECLARE
    v_batchstatus XEVMPD_SUBMITTEDBATCH%ROWTYPE;
    BEGIN

    EVMPDADM.GETALLBATCHES_ARTICLE_57(v_batchstatus);
    DBMS_OUTPUT.PUT_LINE( v_batchstatus.Batch_id || ' ' || v_batchstatus.BATCH_DESCRIPTION || ' ' || v_batchstatus.STATUS || ' ' ||v_batchstatus.RECORD_STATUS || ' ' ||v_batchstatus.NUMBER_OF_RECORDS);

   END;
 /

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


person Jig232    schedule 18.08.2016    source источник
comment
Во-первых, ваша процедура вернет данные только для произвольно последней строки, которую вы извлекли. Кажется маловероятным, что вы хотите приложить все усилия для создания набора результатов и выборки данных только для того, чтобы отбросить все строки, кроме одной, и вам все равно, какая строка будет сохранена. Во-вторых, вы не можете передать переменную %rowtype в dbms_output.put_line. Вы можете передать определенные скалярные атрибуты, например dbms_output.put_line( v_batchstatus.col1 || ' ' || v_batchstatus.col2 || ... );, но вам придется перечислить атрибуты, которые вы хотите видеть.   -  person Justin Cave    schedule 18.08.2016


Ответы (1)


Сообщения об ошибках очень очевидны. Вы вызываете свои процедуры с помощью:

  1. Неверное количество аргументов для EVMPDADM.GETALLBATCHES_ARTICLE_57: он имеет один параметр OUT. Поэтому вам нужно передать этот параметр.
  2. Неверный тип аргумента для DBMS_OUTPUT.PUT_LINE: он имеет один параметр IN VARCHAR2, а не XEVMPD_SUBMITTEDBATCH%ROWTYPE. Прочитайте здесь

Итак, должно быть так:

DECLARE
    v_batchstatus XEVMPD_SUBMITTEDBATCH%ROWTYPE;
    BEGIN

    v_batchstatus:= EVMPDADM.GETALLBATCHES_ARTICLE_57(v_batchstatus);
    --use DBMS_OUTPUT.PUT_LINE for every column of XEVMPD_SUBMITTEDBATCH separately after you convert them to varchar2 if they are not.

END;
/

Кроме того, процедура таким образом вернет только последнюю строку. Так что вы можете изменить это.

Если вы хотите вывести все записи из таблицы, вам нужно добавить DBMS_OUTPUT.PUT_LINE внутри цикла, это станет так:

FOR i IN 1..l_batchstatus.count LOOP  

p_batchstatus:= l_batchstatus(i);

dbms_output.put_line( p_batchstatus.col1 || ' ' || p_batchstatus.col2 || ... );

END LOOP;

Где col1, col2, ... — это имена столбцов XEVMPD_SUBMITTEDBATCH, если они имеют тип VARCHAR2. Или вам потребуется дополнительная обработка

person Hawk    schedule 18.08.2016
comment
Я исправил блок pl-sql. Моя ошибка заключалась в том, что я забыл правильно обработать параметр out и не использовал имена атрибутов при печати. - person Jig232; 18.08.2016
comment
Я обновил вопрос. подскажите, пожалуйста, как распечатать все записи из таблицы. - person Jig232; 18.08.2016
comment
Спасибо, Хоук :) На самом деле проблема в том, что я хочу, чтобы все данные были в качестве выходного параметра, потому что мы хотим показать эти данные в представлении сетки в форме .NET. Я не знаю .NET, и я не уверен, как мой товарищ по команде собирается показать эти данные в виде сетки их. Он просто попросил меня написать процедуру для чтения данных и отправки их в качестве выходного параметра. - person Jig232; 18.08.2016
comment
Используйте sysrefcursor для извлечения записей в форму .NET. Просто погуглите, и вы найдете много решений, использующих sysrefcursor. - person XING; 18.08.2016