2016-01-27 2 views
0

Я создал ТИПцикл внутри курсора оракула

TYPE t_array IS TABLE OF VARCHAR2(15); 

Функция, которая принимает строку, которая содержит «» в качестве разделителя, и функция возвращает t_array которая в основном разделив строку и список значений возвращения ,

FUNCTION split_string(id IN VARCHAR2) 
... 
... 
.... 
RETURN t_array; 
END split_string; 

Теперь моя хранимая процедура занимает в длинных строках в качестве входных данных, вызывает функцию, чтобы разбить строку и петли через t_array и возвращает курсор.

PROCEDURE p_get_xxx(p_id IN VARCHAR2, 
        p_cur_result OUT SYSREFCURSOR) 
AS 
    l_array schema_name.t_array; 
BEGIN 
    l_array := split_string(p_id); 

    OPEN p_cur_result FOR 

    FOR i IN l_array.first .. l_array.last 
    LOOP 
    SELECT * FROM ........ 
    WHERE ID = l_array(i); 
    END LOOP; 
END p_get_xxx; 

Я получаю ошибку компиляции вдоль линий:

Неожиданное «FOR» на месте «(»

Есть ли лучший способ обработки этого сценария, я упускаю какую-то вещь здесь?

+0

Этот код plsql выглядит очень школьным книжным. Только эта часть «OPEN p_cur_result FOR для i IN l_array.first .. l_array.last» просто неверна и выглядит как копирование пасты из разных примеров. –

+0

http://stackoverflow.com/questions/3819375/convert-comma-separated-string-to-array-in-pl-sql – OldProgrammer

ответ

0

Курсор всегда открывается в инструкции SELECT. Насколько я знаю, курсор не открывается, чтобы открыть курсор на FOR loo п.

Мне кажется, что вы действительно хотите создать инструкцию SELECT динамически. Я предлагаю примерно следующее:

PROCEDURE p_get_xxx(p_id IN VARCHAR2, p_cur_result OUT SYSREFCURSOR) 
AS 
    l_array schema_name.t_array; 
    strSelect_statement VARCHAR2(4000); 
BEGIN 
    l_array := split_string(p_id); 

    -- Set up the basics of the SELECT statement 

    strSelect_statement := 'SELECT * FROM SOME_TABLE WHERE ID IN ('; 

    FOR i IN l_array.FIRST..l_array.LAST LOOP 
    strSelect_statement := strSelect_statement || 
          '''' || l_array(i) || ''','; 
    END LOOP; 

    -- Get rid of the unwanted trailing comma 

    strSelect_statement := SUBSTR(strSelect_statement, 1, 
            LENGTH(strSelect_statement)-1); 

    -- Add a right parentheses to close the IN list 

    strSelect_statement := strSelect_statement || ')'; 

    -- Open the cursor 

    OPEN p_cur_result FOR strSelect_statement; 
END p_get_xxx; 

Удачи.

+0

Благодарим за отзыв. Мой оператор SELECT близок к 100 линиям - я попытаюсь использовать этот подход и буду держать вас в курсе, если он работает. – Rohith

+0

Я пробовал этот подход и распечатывал sql, сгенерированный после цикла, и когда я запускаю sql в своем редакторе, он работает так, как ожидалось. Но когда я запускаю действительную процедуру, как-то CURSOR возвращает только записи, связанные с последним элементом массива. Кто-нибудь сталкивался с подобным вопросом с КУРСОМ? – Rohith

+0

Я предлагаю вам задать еще один вопрос для решения этой проблемы, включая весь задействованный код - как PL/SQL, создающий оператор SQL, так и сгенерированный оператор SQL. Благодарю. –

Смежные вопросы