使用VARRAY

时间:2018-02-20 05:28:47

标签: plsql sql-update

我正在尝试学习一些PLSQL,并且我发现自己试图解决一个简单的问题,如果COD编号字段为Odd或Even,则需要在TEXT字段中写入'Odd'或'Even'。非常直截了当,对吧?

DECLARE
   TYPE possible_values IS VARRAY(3) OF VARCHAR2(10); 
   v_values possible_values;
BEGIN
   v_values := possible_values('Even','Odd');

   UPDATE ORG_TAB_PNU t
   SET t.text = v_values(MOD(t.cod, 2) + 1);


   DBMS_OUTPUT.PUT_LINE(v_values(MOD(20, 2) + 1));
 END;

现在,问题似乎是这行代码:

SET t.text = v_values(MOD(t.cod, 2) + 1);

如果我说

就好了
SET t.text = v_values(MOD(1, 2));

SET t.text = MOD(t.cod, 2) + 1;

我可以使用数组的任何元素,或者字段t.cod的值,但我不能一起使用它们,因为它会返回:

Error report -
ORA-06550: line 8, column 31:
PLS-00201: identifier 'T.COD' must be declared
ORA-06550: line 8, column 18:
PL/SQL: ORA-00904: : invalid identifier
ORA-06550: line 7, column 5:
PL/SQL: SQL Statement ignored
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:

我在这里缺少什么?我是否误解了数组在plsql中的工作原理?

2 个答案:

答案 0 :(得分:0)

ANSI SQL将表引用(相关名称)限定为只有一个级别。

看一下这个讨论nesting limit for correlated subqueries

答案 1 :(得分:0)

PL / sql引擎首先尝试解析v_values(MOD(t.cod, 2) + 1)并将值传递给SQL引擎。但是{/ 1}}对于pl / sql引擎是未知的。

解决方法:

创建存储函数

t.cod