为什么这里需要模式名称以及如何在没有它的情况下进行编译

问题描述

我正在开发一个与 Oracle 18c 数据库链接的 Oracle Forms 11g 应用程序,在编译我的表单时偶然发现了一个奇怪的错误

这是一个说明问题的片段(我更改了标识符名称,但没关系):

PROCEDURE SOME_PROCEDURE(...) IS
  v_arg1 relation.c_arg1%type;
  v_arg2 relation.c_arg2%type;
  v_arg3 relation.c_arg3%type;
BEGIN

  SELECT r.c_arg1,r.c_arg2,r.c_arg3
    INTO v_arg1,v_arg2,v_arg3
    FROM relation r
   WHERE ...

  -- Some more code ...

END;

当我编译时,我得到的错误是:

Compilation errors on SOME_PROCEDURE:
PL/sql ERROR 302 at line 2,column 19
component 'C_ARG1' must be declared
PL/sql ERROR 0 at line 2,column 10
Item ignored
PL/sql ERROR 302 at line 3,column 19
component 'C_ARG2' must be declared
PL/sql ERROR 0 at line 3,column 10
Item ignored
PL/sql ERROR 302 at line 4,column 19
component 'C_ARG3' must be declared
PL/sql ERROR 0 at line 4,column 10
Item ignored

relation 这里是一个表名,导致了问题。如果出于测试目的,我选择另一个表和字段名称,则代码编译良好,例如v_arg1 other_table.other_field%type;

我想可能 relation一个保留关键字(尽管我在文档中找不到关于此特定关键字的任何内容,哎呀),所以我尝试将架构名称 admin 放在表名:

PROCEDURE SOME_PROCEDURE(...) IS
  v_arg1 admin.relation.c_arg1%type;
  v_arg2 admin.relation.c_arg2%type;
  v_arg3 admin.relation.c_arg3%type;
BEGIN

而且它工作得很好。现在这一个问题,因为 admin 不是一个固定的名称,并且会因为多个架构用于多种目的(即开发、测试、生产等)而发生变化。

这就是我被卡住的地方。我不知道如何以“正确”的方式执行此操作:因为 %type 是具有一定长度的 VARCHAR2,我将使用诸如 VARCHAR2(100) 之类的大内容,希望将来它不会出错。>

我的问题是,是否可以想出一种方法来引用此表而不指定架构?

这是为了我的工作,我在更改表/模式名称等方面没有太多自由。

谢谢

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)