我是 PL/SQL 新手,我正在尝试使用 %rowtype 创建一种表类型,然后声明一个变量并执行某种操作示例;下面是我正在尝试的逻辑的代码片段:
DECLARE
TYPE my_type IS TABLE OF emp%rowtype INDEX BY PLS_INTEGER;
l_arr_type my_type;
BEGIN
SELECT * BULK COLLECT INTO l_arr_type FROM emp;
FOR rec IN (SELECT * FROM TABLE (l_arr_type) ORDER BY HIREDATE)
LOOP
DBMS_OUTPUT.PUT_LINE('Ename is: '||rec.ENAME||' and hire date is: '||rec.HIREDATE);
END LOOP;
END;
错误:
ORA-06550:第 8 行,第 38 列:PLS-00382:表达式类型错误
但是当我在包内声明变量并使用相同的变量时,同样的事情正在起作用;我在这里错过了什么吗?这不是一个奇怪的行为吗? 以下是工作代码片段:
CREATE OR REPLACE PACKAGE my_array IS
TYPE my_type IS TABLE OF emp%rowtype INDEX BY PLS_INTEGER;
END my_array;
/
DECLARE
l_arr_type my_array.my_type;
BEGIN
SELECT * BULK COLLECT INTO l_arr_type FROM emp;
FOR rec IN (SELECT * FROM TABLE (l_arr_type) ORDER BY HIREDATE)
LOOP
DBMS_OUTPUT.PUT_LINE('Ename is: '||rec.ENAME||' and hire date is: '||rec.HIREDATE);
END LOOP;
END;
如果我能得到这种行为背后的澄清,将会很有帮助;
SQL 与 PL/SQL 不同。它们由不同的引擎处理,并具有一组不同的可识别类型。从历史上看,SQL 只能导航作为 SQL 类型的集合 (
create type ...
)。它无法访问 PL/SQL 类型。
但从 12.1 开始,Oracle 开始允许
TABLE
SQL 运算符访问 PL/SQL 集合,但要求它们在 包头 中定义。包头有点像对象规范,外部代码以及现在的 SQL 引擎本身可以询问以了解如何访问 PL/SQL 对象(包括集合),就像以前只能使用声明的 SQL 类型一样。