oracle中的表变量

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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:此处不允许执行过程,函数,包或类型。

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

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

答案

你没有退货:

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;
另一答案

你可以返回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;

以上是关于oracle中的表变量的主要内容,如果未能解决你的问题,请参考以下文章

如何创建片段以重复变量编号中的代码行

plsql-Oracle 集合

如何将oracle表中的字段由integer 转变为varchar2(50)

sql Oracle代码片段

如何在导航抽屉活动模板中的片段之间传递字符串变量

Oracle过程 - 选择所有表,然后循环遍历这些表的记录