【问题标题】:Why i'm getting "PLS-00302: component 'TABLE_NAME' must be declared"?为什么我得到“PLS-00302:必须声明组件'TABLE_NAME'”?
【发布时间】:2021-05-05 15:04:31
【问题描述】:

我正在尝试在 Oracle 12.2 DB 中创建一个相当简单的存储过程:

create or replace procedure list_tables (
    p_src_schema    varchar2
)
as
    l_src_schema    varchar2(30)    := upper(p_src_schema);
begin
    for x in (select table_name name from all_tables where owner = l_src_schema
              and not regexp_like(table_name, '(AAA|BKP_|LOG_|TMP_|TEST|XX).*')
              order by table_name)
    loop
        dbms_output.put_line(x.table_name);
    end loop;
end;
/
show errors

我收到以下错误:

LINE/COL ERROR
-------- -----------------------------------------------------------------
11/9     PL/SQL: Statement ignored
11/32    PLS-00302: component 'TABLE_NAME' must be declared

错误出现在以下行:dbms_output.put_line(x.table_name);

问题:我做错了什么?我一定是在监督一些非常明显的事情......


更新: 别名 name 在按下 <TAB> 后被 dBeaver 自动完成功能“添加”了 - 我没有注意到。 ;)

【问题讨论】:

  • 侧面观察 - 您正在从 ALL_TABLES 中进行选择。这只会获取执行该过程的用户拥有权限的表。假设输入模式是 FRED,该过程由 SCOTT 执行,并且 FRED 拥有 SCOTT 没有权限的表。这些表格将不会被报告。我认为您应该从 DBA_TABLES 中进行选择,并确保执行该过程的用户对该视图具有权限。
  • @EdStevens,我没有 DBA 权限,所以我不能使用 DBA_* 视图)

标签: oracle stored-procedures plsql oracle12c


【解决方案1】:

因为您使用了列别名

select table_name name from
                  ----

这意味着你应该使用过

dbms_output.put_line(x.name);

改为。

【讨论】:

  • 天啊,我真是太愚蠢了!非常感谢! :)
猜你喜欢
  • 2015-04-26
  • 2019-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-05
  • 1970-01-01
  • 2021-01-06
相关资源
最近更新 更多