sql - 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 中的转换代码再次询问。
解决方案
你可以退货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;
推荐阅读
- spring-boot - 关闭 HikariPool 中的异常日志记录
- kubernetes - Kubeadm init 挂在 [init] 如果必须拉取控制平面映像,这可能需要一分钟或更长时间
- laravel - 从数据库中提取变量时如何评估 Blade 变量
- reactjs - 使用“誓言”身份验证在 reactjs 应用程序中集成 Jira REST API
- c# - 如何对 64 位 .NET 4.7 项目进行单元测试?
- javascript - 更改子悬停时的父背景
- javascript - 以编程方式在儿童上设置“样式”时,iOS 上的 CSS Scroll Snap 视觉故障
- java - 使用 xml 解析时显示 null 的文档
- reactjs - 组件不会从 mapStateToProps 渲染
- r - 密度图 - 如何改变 x 轴上的频率