plsql - 为集合内的记录分配值时出错
问题描述
我需要遍历 plsql 代码中的一些值。所以试图创建一个记录集合。得到如下所述的错误。请帮我解决
-- please see the code below
declare
type tab_name is record (t_name varchar2(30),col_name varchar2(30));
type tab_list is table of tab_name;
table_names tab_list:=tab_list(tab_name('ABC','abc'),tab_name('XYZ','xyz'));
begin
for i in table_names.first..table_names.last loop
dbms_output.put_line(table_names(i).t_name||'-'||table_names(i).col_name);
end loop;
end;
/
Error report -
ORA-06550: line 4, column 32:
PLS-00222: no function with name 'TAB_NAME' exists in this scope
ORA-06550: line 4, column 13:
PL/SQL: Item ignored
ORA-06550: line 6, column 10:
PLS-00320: the declaration of the type of this expression is incomplete or malformed
ORA-06550: line 6, column 1:
PL/SQL: Statement ignored
06550. 00000 - "line %s, column %s:\n%s"
*Cause: Usually a PL/SQL compilation error.
*Action:
解决方案
记录类型的名称不是它的初始化器。事实上,oracle 中根本没有记录类型的类初始化函数:
请注意,在示例 5-47 中,值是分别分配给记录的每个字段的。您不能使用赋值语句将值列表分配给记录。记录没有类似构造函数的表示法。
您必须分别创建每个对象,然后用它们创建集合:
declare
type tab_name is record (t_name varchar2(30),col_name varchar2(30));
type tab_list is table of tab_name;
name_1 tab_name;
table_names tab_list;
begin
name_1.t_name := 'ABC';
name_1.col_name := 'abc';
table_names := tab_list();
table_names.extend;
table_names(table_names.last) := name_1;
name_1.t_name := 'XYZ';
name_1.col_name := 'xyz';
table_names.extend;
table_names(table_names.last) := name_1;
for i in table_names.first..table_names.last
loop
dbms_output.put_line(table_names(i).t_name||'-'||table_names(i).col_name);
end loop;
end;
集合确实有初始化器。但是,在您的情况下,您有一组记录类型,因此您必须预先创建记录才能使用它。
推荐阅读
- php - 提交 Google 自定义搜索
- sql - SQL - 计算百分比增加?
- php - 共享服务器上的 Codeigniter Php.ini 文件位置以增加文件上传限制
- vba - 用非易失性VBA方法替换Indirect,但不能用OFFSET等Excel函数嵌套返回值?
- python-3.x - python访问互联网网络抓取代理
- .net - FileHelpers 如何从流中读取
- ios - UIPanGestureRecognizer 捕获的 UIButton 触摸事件
- java - JPA(休眠)OneToOne 阻抗不匹配
- observable - 使用 forkJoin Angular 6 链接
- wordpress - 致命错误:在 ---- Wordpress 插件错误中调用未定义函数 _e()