Oracle Forms 编译器将类型标记为函数

Posted

技术标签:

【中文标题】Oracle Forms 编译器将类型标记为函数【英文标题】:Oracle Forms compiler mark a type as function 【发布时间】:2016-12-21 17:01:03 【问题描述】:

我正在 Oracle 表单中创建一个过程,该过程调用插入表(解决方案表)中的回溯。该回溯由项目(bean)的可变数组(ítem_array)提供。问题是编译器说没有函数名。

数据库中的现有对象:

CREATE TYPE item IS object( NUM_OPERACIO NUMBER, TITULS NUMBER); 
CREATE TYPE item_array IS VARRAY(1000) OF item;
create table my_table (NUM_OPERACIO NUMBER, TITULS NUMBER);
insert into my_table ( NUM_OPERACIO,TITULS ) values (1,10);
insert into my_table ( NUM_OPERACIO,TITULS ) values (2,20)
insert into my_table ( NUM_OPERACIO,TITULS ) values (3,30)

程序

PROCEDURE solver 
 IS
  arr item_array;  
 BEGIN

  SELECT item( NUM_OPERACIO,TITULS )
  BULK COLLECT INTO arr
  FROM   my_table;  

  delete from solucion ;

  backtra(arr,1,0,30);
END;

我能做些什么来解决这个问题?

【问题讨论】:

这看起来不错,只要一切都在同一个模式中完成(或权限等设置正确),并且类型已成功创建。您得到的完整错误消息堆栈是什么? error591。客户端安装的程序不支持此功能。错误 222. 在此范围内没有函数名称 ítem 。错误 0 。语句忽略。 您在什么架构下创建对象itemitem_arraymy_table?确保这些对象具有 APPS 的同义词,否则它们对 Oracle Forms 的默认模式 (APPS) 不可见。 【参考方案1】:

这是一个 PLS 错误号。来自the documentation:

“PLS-00591:客户端程序不支持此功能 原因:在错误的上下文中使用了以下功能之一:pragma AUTONOMOUS_TRANSACTION、动态 SQL 语句(例如 EXECUTE IMMEDIATE)和批量绑定。这些列出的功能只能在服务器端程序中使用,而不能在客户端程序中使用。”

您的代码使用批量绑定,因此该错误适合。表单 PL/SQL 和数据库 PL/SQL 相似,但它们使用不同的引擎,两者支持的功能只是两者中所有功能的子集。解决方案是将数组填充传递到数据库过程中,并根据需要从 Forms 中调用它。

如果不确切知道您要解决什么问题,就很难给出更好的答案。

【讨论】:

以上是关于Oracle Forms 编译器将类型标记为函数的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Forms 10g 中创建/修改的 Form(FMB) 降级为 Oracle Forms 9

将 PLSQL 过程/函数标记为已弃用

将构造函数标记为 __explicitly__ 需要对象类型

如何找到Oracle Forms接口集成的PL/SQL程序

让 oracle 函数知道数据是不是为素数。收到警告:创建时出现编译错误的函数

编译器:如何解析函数调用和函数定义