PLSQL: процедура вывода нескольких курсоров - PullRequest
1 голос
/ 02 января 2012

Я бы хотел вернуть несколько курсоров за одну процедуру, одну на основе другой.

Мой текущий код:

TYPE REFCURSOR IS REF CURSOR; 

PROCEDURE GETCARS(oCARS OUT REFCURSOR)
BEGIN
    OPEN oCARS FOR SELECT * FROM CARS;
END GETCARS;

Я не уверен, что это возможно, но я хочу сделать что-то вроде:

PROCEDURE GETCARS(oCARS OUT REFCURSOR, oREPAIRS OUT REFCURSOR)
BEGIN
    OPEN oCARS FOR SELECT * FROM CARS;
    ..??..
END GETCARS;

, который будет возвращать в качестве второго параметра все исправления, связанные с текущей выбранной строкой oCARS. (Таблица ремонта имеет ФК для id_car из автомобилей)

Теперь я делаю это на стороне C #, когда я выбираю одну строку из курсора oCARS, я вызываю вторую процедуру, которая дает мне список исправлений, но, возможно, как-то возможно сделать это за одну процедуру (что даст мне прирост производительности? - Я не хочу использовать join, потому что он возвращает умноженные автомобили для каждого ремонта)

Ответы [ 2 ]

2 голосов
/ 03 января 2012

Как насчет

PROCEDURE GETCARS(oCARS OUT SYS_REFCURSOR, oREPAIRS OUT SYS_REFCURSOR, oCHARGES OUT SYS_REFCURSOR) 
BEGIN 
    OPEN oCARS FOR SELECT * FROM CARS; 
    OPEN oREPAIRS FOR SELECT * FROM REPAIRS;
    OPEN oCHARGES FOR SELECT * FROM CHARGES;
END GETCARS; 

Делись и наслаждайся.

1 голос
/ 03 января 2012

Простой ответ заключается в том, что вы не можете делать то, что пытаетесь.

Курсоры - это просто указатели на начало набора результатов, который содержит результаты запроса.Пока вы не получите строку, невозможно узнать, что будет содержать эта строка.Поскольку ваше приложение, а не код PL / SQL, выполняет выборку, часть PL / SQL не знает о возвращаемых значениях.

Чтобы сделать то, что вы пытаетесь, базе данных придетсяобнаружите выборку из первого запроса, создайте новый набор результатов, используя второй запрос, затем поместите новый набор результатов по адресу, который процедура первоначально возвратила для второго курсора.Базы данных просто не предназначены для операций такого типа.

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