在 Oracle 中分配数组或表变量

无牛人

我正在尝试更新 Oracle 包中的存储过程。最初,SP 被设置为假设将单个项目 id 传递给它,但现在有可能以逗号分隔字符串的形式传递一组项目 id。

我正在尝试将此字符串拆分为一组字符串并循环遍历它。我设法拆分了字符串,但似乎无法将其分配给可用于循环的变量。

PROCEDURE USPGETSOMTHING
(
IPSITEMIDS                VARCHAR2,
....,
CUR_OUT                   OUT GETDATACURSOR
)
IS
...;
V_NEWITEM VARCHAR2(4000);
V_NEWITEMLIST VARCHAR2(4000);  

-- Tried declaring an array; not good!
type array_t is table of varchar(20);
V_NEWITEMLIST array_t;

BEGIN

-- string passed to SP is in the form of "'LP060500105','EM060500103'"
V_NEWITEM := REPLACE(IPSITEMIDS, '''', '');

-- This comma-separated string will actually be V_NEWITEM
SELECT  REGEXP_SUBSTR('LP060500105,EM060500103', '[^,]+', 1, LEVEL) INTO V_NEWITEMLIST FROM DUAL
CONNECT BY instr('LP060500105,EM060500103', ',',1, LEVEL-1) > 0;

以上不起作用,我得到:

ORA-01422: exact fetch returns more than requested number of rows

我需要解决的下一个问题是在数据表中返回结果。

目前,我使用:

IF (...)
....
LVSQUERY:='SELECT '''|| V_NEWITEM ||''' AS ITEMID, '''|| V_OUTCOME ||''' AS OUTCOME FROM DUAL';
END IF;

OPEN CUR_OUT FOR LVSQUERY;

我如何确保结果数据表的行数与项目 ID 的数量一样多,这是拆分项目 ID 字符串的结果?

开始

您可以尝试使用 CURSOR 并遍历记录。

PROCEDURE USPGETSOMTHING
(
IPSITEMIDS                VARCHAR2,
....,
CUR_OUT                   OUT GETDATACURSOR
)
IS
...;
V_NEWITEM VARCHAR2(4000);
V_NEWITEMLIST VARCHAR2(4000);  

CURSOR cur IS
SELECT  REGEXP_SUBSTR('LP060500105,EM060500103', '[^,]+', 1, LEVEL) V_NEWITEMLIST 
FROM DUAL
CONNECT BY instr('LP060500105,EM060500103', ',',1, LEVEL-1) > 0;

-- Tried declaring an array; not good!
type array_t is table of varchar(20);
V_NEWITEMLIST array_t;

BEGIN

-- string passed to SP is in the form of "'LP060500105','EM060500103'"
V_NEWITEM := REPLACE(IPSITEMIDS, '''', '');

FOR rec IN cur LOOP
    --- whatever you want to do referencing the field in the cursor by rec.V_NEWITEMLIST
END LOOP;

你也可以试试 OPEN ... FOR

PROCEDURE uspgetsomthing
(    IPSITEMIDS                VARCHAR2,

CUR_OUT                   OUT SYS_REFCURSOR
)
IS


BEGIN

OPEN CUR_OUT    FOR

   SELECT  REGEXP_SUBSTR('LP060500105,EM060500103', '[^,]+', 1, LEVEL) V_NEWITEMLIST 
    FROM DUAL
    CONNECT BY instr('LP060500105,EM060500103', ',',1, LEVEL-1) > 0;
END; -- Procedure

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在循环中分配数组的值

来自分类Dev

在Fortran子例程中分配数组

来自分类Dev

在多行texbox winforms中分配数组

来自分类Dev

Oracle-从集合中分配正确的日期

来自分类Dev

PDO:fetchAll分配数组变量

来自分类Dev

使用索引功能在R中分配数组值

来自分类Dev

如何从初始化列表中分配数组

来自分类Dev

如何在Python中分配数组大小

来自分类Dev

如何在Java中分配数组中的元素数?

来自分类Dev

相应地在php中分配数组值

来自分类Dev

在每个循环中分配数组值

来自分类Dev

使用索引功能在R中分配数组值

来自分类Dev

在多个选择框中分配数组值

来自分类Dev

在数组键中分配变量

来自分类Dev

根据登录在Oracle APEX 5中分配首页

来自分类Dev

从数据表结果中分配变量

来自分类Dev

在 Oracle 中分组数据

来自分类Dev

我如何在C#.net中分配值时分配数组的键

来自分类Dev

用C也给变量字符串分配数组

来自分类Dev

用外部全局变量C分配数组大小

来自分类Dev

C#简单循环来分配数组变量

来自分类Dev

角度数据表无法从变量分配数据

来自分类Dev

Oracle表中分母的最小公倍数的计算

来自分类Dev

如何在OpenGL片段着色器中分配数组?

来自分类Dev

EF Linq to Entity在类初始值设定项中分配数组成员

来自分类Dev

如何通过循环在多维数组中分离和分配数据-PHP

来自分类Dev

是否可以从数组中获取值以在ajax中分配数据名称?

来自分类Dev

在 C# 中的对象初始值设定项中分配数组值

来自分类Dev

Oracle分配与选择进入