首页 > 解决方案 > 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 上已经提出的问题的理解,在下面发布我对 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: procedure, function, package, or type is not allowed here.

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

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

标签: sqloracletsqlplsql

解决方案


你可以退货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;

推荐阅读