Табличные переменные в oracle

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

CREATE FUNCTION [dbo].[ufn_CSVToTable] ( @StringInput VARCHAR(8000) )
RETURNS @OutputTable TABLE ( [String] VARCHAR(20) )
AS
BEGIN
    DECLARE @String    VARCHAR(20)

    WHILE LEN(@StringInput) > 0
    BEGIN
        SET @String      = LEFT(@StringInput, 
                                ISNULL(NULLIF(CHARINDEX(',', @StringInput) - 1, 
        -1),
                                LEN(@StringInput)))
        SET @StringInput = SUBSTRING(@StringInput,
                                     ISNULL(NULLIF(CHARINDEX(',', @StringInput), 
        0),
                                     LEN(@StringInput)) + 1, LEN(@StringInput))

    INSERT INTO @OutputTable ( [String] )
        VALUES ( @String )
    END

    RETURN
END 

Я не могу найти концепцию табличной переменной в oracle.

Может ли кто-нибудь помочь мне узнать, как заменить переменную таблицы в oracle.

Публикация моего преобразования в оракул ниже на основе моего понимания из вопросов, уже заданных на SO:

CREATE TYPE Output AS OBJECT (str VARCHAR2 (20));

CREATE TYPE OutputTable AS TABLE OF Output;

CREATE OR REPLACE FUNCTION ufn_CSVToTable (p_StringInput VARCHAR2)
    RETURN OutputTable
AS
    v_String        VARCHAR2 (20);
    v_StringInput   VARCHAR2 (8000);
BEGIN
    WHILE LENGTH (RTRIM (p_StringInput)) > 0
    LOOP
        v_String :=
            SUBSTR (
                p_StringInput,
                1,
                NVL (NULLIF (INSTR (p_StringInput, ',') - 1, -1),
                     LENGTH (RTRIM (p_StringInput))));
        v_StringInput :=
            SUBSTR (
                p_StringInput,
                  NVL (NULLIF (INSTR (p_StringInput, ','), 0),
                       LENGTH (RTRIM (p_StringInput)))
                + 1,
                LENGTH (RTRIM (p_StringInput)));

        INSERT INTO Output (str)
             VALUES (v_String);
    END LOOP;

    RETURN;
END;

Но я все еще получаю следующие ошибки:

1.[Error] ORA-04044 (25: 21): PL/SQL: ORA-04044: procedure, function, package, or type is not allowed here.

2.[Error] PLS-00503 (29: 5): PLS-00503: RETURN statement required for this return from function

ПРИМЕЧАНИЕ: Я задавал этот вопрос раньше, но он был закрыт, поэтому задаю его снова с преобразованным кодом в oracle на основе моего понимания из содержимого, прочитанного на SO.

Вместо того, чтобы напрямую спрашивать, как преобразовать один код в другой, расскажите нам о ваших выборочных данных и окончательном ожидаемом результате. В Oracle могут быть гораздо лучшие способы выполнить то, что вы пытаетесь сделать.

Kaushik Nayak 31.10.2018 14:58
0
1
188
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы ничего не возвращаете:

RETURN;

Должно быть что-то вроде:

RETURN myTableOfMyTypeVariableWhichIDidDeclareBetweenAsAndBegin;

Вот какой-то анонимный блок, объясняющий, как что-то вернуть (return не комментируется, потому что он работает только в функциях):

declare
    TYPE myTableType IS TABLE OF VARCHAR2 (20); -- define type
    v_myTable myTableType; -- define variable of your type
begin
    v_myTable := myTableType(); 

    v_myTable.extend;
    v_myTable(1) := 'Test1';

    v_myTable.extend;
    v_myTable(2) := 'Test2';

    dbms_output.put_line('v_myTable(1): ' || v_myTable(1));
    dbms_output.put_line('v_myTable(2): ' || v_myTable(2)); 

    --return v_MyTable; -- Return the object you created / Works only within a function
end;

Я хочу вернуть таблицу, которую я объявляю над функцией здесь, поэтому не знаю, как это сделать

vikky 31.10.2018 14:45

Я добавил полный пример Table-Of-Something-Type

kara 31.10.2018 14:49

@vikky Если ответ поможет, вы можете принять это;)

kara 31.10.2018 17:41

Вы можете вернуть sys_refcursor

CREATE OR REPLACE FUNCTION ufn_CSVToTable (p_StringInput VARCHAR2)
    return sys_refcursor 
is
   rf_cur   sys_refcursor;
   v_String        VARCHAR2 (20);
   v_StringInput   VARCHAR2 (8000);
BEGIN
    WHILE LENGTH (RTRIM (p_StringInput)) > 0
    LOOP
        v_String :=
            SUBSTR (
                p_StringInput,
                1,
                NVL (NULLIF (INSTR (p_StringInput, ',') - 1, -1),
                     LENGTH (RTRIM (p_StringInput))));
        v_StringInput :=
            SUBSTR (
                p_StringInput,
                  NVL (NULLIF (INSTR (p_StringInput, ','), 0),
                       LENGTH (RTRIM (p_StringInput)))
                + 1,
                LENGTH (RTRIM (p_StringInput)));

        INSERT INTO Output (str)
             VALUES (v_String);
    END LOOP;
     open rf_cur for
      select *
        from Output;
   return rf_cur;
END;

Другие вопросы по теме