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中的表变量的主要内容,如果未能解决你的问题,请参考以下文章