从Varray Oracle中删除元素

时间:2018-04-15 20:01:08

标签: oracle collections varray

我创建了Varray:

CREATE TYPE mytype IS VARRAY(4)OF VARCHAR2(50); /

然后创建表格为:

CREATE TABLE tbl(     一个号码,     b VARCHAR2(30),     c mytype);     /

插入的值为:

INSERT INTO tbl(a,b,c)   价值观(1,' Eng',           mytype(' qq',' rr',' yy',' ttt'));

我如何才能删除元素' ttt' ??谢谢!!

1 个答案:

答案 0 :(得分:1)

Oracle文档声明这不可能直接通过SQL实现:

  

5.3.2.3 Performing Atomical Changes on VARRAYs and Nested Tables

     

您可以对嵌套表和VARRAY进行原子更改。

     

注意:虽然嵌套表也可以分段方式更改,但varrays不能。

     

示例5-25显示了如何使用PL / SQL语句操作SQL varray对象类型。在此示例中,varrays在PL / SQL变量和SQL表之间传输。您可以插入包含集合的表行,更新行以替换其集合,并选择集合到PL / SQL变量中。

     

但是,您无法直接使用SQL更新或删除单个varray元素;你必须从表中选择varray,在PL / SQL中更改它,然后更新表以包含新的varray。您也可以使用嵌套表执行此操作,但嵌套表可以选择执行分段更新和删除。

此外,您还可以删除VARRAY中的随机给定元素,因为它们是密集数组(其中没有间隙)。虽然您的示例中可以使用VARRAY函数删除TRIM中的最后一个条目,因此删除ttt,但您无法继续,例如删除rr,如果没有一些聪明的PL / SQL来创建一个新的VARRAY,该条目不在其中。这是聪明的PL / SQL:

CREATE OR REPLACE FUNCTION delete_entry(p_record IN mytype, p_val IN VARCHAR2)
RETURN mytype
IS
   v_ret  mytype := mytype();
BEGIN
   FOR n IN p_record.FIRST..p_record.LAST LOOP
      IF p_record(n) != p_val THEN
        v_ret.EXTEND;
        v_ret(v_ret.LAST) := p_record(n);
      END IF;
   END LOOP;
   RETURN v_ret;
END;
/

这导致所有这些:

SQL> CREATE TYPE mytype IS VARRAY(4) OF VARCHAR2(50);
  2  /

Type created.

SQL> CREATE TABLE tbl( a NUMBER, b VARCHAR2(30), c mytype);

Table created.

SQL> INSERT INTO tbl(a, b, c)
  VALUES (1,'Eng', mytype('qq','rr', 'yy', 'ttt'));
  2
1 row created.

SQL> select * from tbl;

     A B
---------- ------------------------------
C
--------------------------------------------------------------------------------
     1 Eng
MYTYPE('qq', 'rr', 'yy', 'ttt')


SQL> CREATE OR REPLACE FUNCTION delete_entry(p_record IN mytype, p_val IN VARCHAR2)
RETURN mytype
IS
   v_ret  mytype := mytype();
BEGIN
   FOR n IN p_record.FIRST..p_record.LAST LOOP
      IF p_record(n) != p_val THEN
        v_ret.EXTEND;
        v_ret(v_ret.LAST) := p_record(n);
      END IF;
   END LOOP;
   RETURN v_ret;
END;
/
  2    3    4    5    6    7    8    9   10   11   12   13   14
Function created.

SQL> UPDATE tbl SET c = delete_entry(c, 'ttt');

1 row updated.

SQL> select * from tbl;

     A B
---------- ------------------------------
C
--------------------------------------------------------------------------------
     1 Eng
MYTYPE('qq', 'rr', 'yy')