Заполнение курсора переменной типа строки - PullRequest
1 голос
/ 02 августа 2011

Кажется, что ни один гугл не найдет ответа на этот вопрос ...

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

У него есть переменная ROWTYPE, которая определяется следующим образом:

myRow my_tbl%ROWTYPE;

Прямо сейчас sproc выполняет некоторую логику, которая заполняет переменную rowtype, а затем использует ее для заполнения таблицы:

INSERT INTO MY_TBL
(   col1,
    col2,
    col3,
    -snip-
) 
VALUES (
    myRow.aValue,
    myRow.aValue2,
    myRow.aValu3,
    -snip-
)

Вместо заполнения таблицы я хочу использовать ROWTYPE для заполнения курсора, который возвращается в веб-приложение. Однако я не могу найти способ сделать это преобразование ROWTYPE -> REF CURSOR. Это возможно? Если нет, есть ли способ вручную заполнить курсор данными, взятыми из различных таблиц и используя некоторую сложную логику? Я использую Oracle 10g.

Спасибо!

Ответы [ 2 ]

3 голосов
/ 02 августа 2011

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

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

1) Создайте курсор, выбрав рассчитанный вамипеременные из dual

DECLARE
    refcur SYS_REFCURSOR;
    myRow TBL%ROWTYPE;
BEGIN
    myRow.aValue := 1;
    myRow.aValue2 := 3;
    myRow.aValue3 := 5;    
    OPEN refcur
    FOR
        select
            myRow.aValue,
            myRow.aValue2,
            myRow.aValue3
        from
            dual;
    CLOSE refcur;
END;

2) Создайте конвейерную функцию, которая возвращает таблицу вашего типа строки, и создайте курсор из выбора из этой функции.

0 голосов
/ 02 августа 2011

Выбор из двойного будет что-то вроде

select  myRow.aValue,
        myRow.aValue2,
        myRow.aValu3
from dual;

Вы должны быть в состоянии объявить курсор для этого.

Есть хорошая запись REF CURSOR в http://psoug.org/reference/ref_cursors.html

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