oracle中的表变量

问题描述 投票:0回答:2

我是数据库概念的新手。我目前有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上已经提出的问题的理解,将我的转换发布到oracle:

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. [错误] ORA-04044(25:21):PL / SQL:ORA-04044:此处不允许执行过程,函数,包或类型。

2. [错误] PLS-00503(29:5):PLS-00503:从函数返回所需的RETURN语句

注意:我之前已经问过这个问题,但它已经关闭了,所以根据我在SO上阅读的内容的理解,再次使用oracle中的转换代码再次询问它。

sql oracle tsql plsql
2个回答
0
投票

你没有退货:

RETURN;

应该是这样的;

RETURN myTableOfMyTypeVariableWhichIDidDeclareBetweenAsAndBegin;

这里有一些匿名块来解释如何返回一些东西(返回已经过评论,因为它只适用于函数):

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;

0
投票

你可以返回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;
© www.soinside.com 2019 - 2024. All rights reserved.