5

我想问一下这个错误...

   Error 49 at line 5, column 6
       bad bind variable 'S_ORD.payment_type'

这是代码:

    DECLARE
     N NUMBER;
      v_credit S_CUSTOMER.credit_rating%type;
    BEGIN
      IF :S_ORD.payment_type = 'CREDIT' THEN
        SELECT credit_rating
        INTO v_credit
        FROM S_CUSTOMER
      WHERE :S_ORD.customer_id = id;
      IF v_credit NOT IN ('GOOD', 'EXCELLENT') THEN
            :S_ORD.payment_type:= 'CASH';
          n:=SHOW_ALERT('Payment_Type_Alert');
      END IF;
     END IF;
   END;

我是 oracle 表单的新手,所以我不确定我是否缺少设置或任何东西。S_ORD 表存在并且有一个列 payment_type,它由 'CREDIT' 和 'CASH' 值组成。谢谢你。

4

4 回答 4

2

当代码位于库或菜单中时,Oracle Forms 不允许使用绑定变量。

这是来自 Oracle Forms (6i) 帮助的引用:

您可以使用 NAME_IN 和 COPY 内置子程序间接引用项目。NAME_IN 函数返回指定变量或项的内容。使用 NAME_IN 函数获取项目的值,而不直接引用项目。以下语句是等效的:

IF :emp.ename = 'smith' -- 直接引用
IF NAME_IN('emp.ename') = 'smith' -- 间接引用

返回值始终是一个字符串。要将 NAME_IN 用于 DATE 或 NUMBER 项,请使用适当的转换函数将字符串转换为所需的数据类型:

date_var := TO_DATE(Name_In('order.date_item'));
num_var := TO_NUMBER(Name_In('order.number_item'));

关于 NAME_IN 的注释:

· NAME_IN 函数不能返回全局或局部变量的内容。

· 在将在输入查询模式下执行的 PL/SQL 触发器中,您必须使用 NAME_IN 而不是普通的绑定变量表示法来访问数据块中的值。(这是因为最终用户可能会在项目中键入关系运算符,从而产生一个不能由 PL/SQL 处理的形式的值。)

COPY 过程 COPY 过程将指示值分配给指示变量或项。然而,与标准 PL/SQL 赋值不同,使用 COPY 过程允许您间接引用正在设置其值的项:

:emp.ename := '史密斯'; -- 直接引用 Copy('smith','emp.ename'); -- 间接引用

COPY 可以与 NAME_IN 函数一起使用,为名称存储在引用变量或项目中的项目赋值:

/* 将值 'smith' 放入名称存储在 ref_item 中的项目 */ Copy('smith',Name_In('control.ref_item'));

为什么使用间接引用间接
引用项目允许您编写更通用、可重用的代码。通过使用变量代替实际项目名称,您可以编写一个子程序,该子程序可以对名称已分配给指定变量的任何项目进行操作。此外,当您在库或菜单模块中编写的 PL/SQL 中引用表单绑定变量(项、参数、全局变量)的值时,必须使用间接引用。因为库、菜单和表单是独立的应用程序模块,所以您不能在菜单项命令或库过程中直接引用表单项的值。

于 2012-07-05T08:00:56.477 回答
1

对于一个简单的答案 -

在 Oracle 表单中

 :S_ORD.payment_type

将意味着您有一个名为DATA_BLOCK(可能是 a )的 named 。S_ORDelementTEXT ITEMPAYMENT_TYPE

因此,除非 Oracle 表单上有任何此类数据块和元素,否则它将继续出错。使用冒号的绑定变量与在or:中的工作方式不同。作为解决方案,您可以在桌子上作为SQLPL/SQLDECLARECURSORS_ORD

CURSOR c_pymnt_type IS
 SELECT payment_type
   FROM S_ORD;

然后OPEN,FETCHCLOSE过程中的光标。

于 2012-08-15T16:03:21.553 回答
0

我注意到您正在尝试遵循来自http://www.oracle.com/webfolder/technetwork/tutorials/obe/forms/11g/formsmenuscreate/formsmenuscreate.htm的 Oracle 教程

通过转到数据块中的每个项目并将属性选项板中的项目类型更改为列表中所选项目之后的下一个项目类型,可以轻松解决该问题。

这适用于 oracle 表格 10。

于 2014-06-07T03:19:29.637 回答
0

显然,我们很难知道你做了什么,因为我们看不到你的代码,而且你没有给我们太多信息。所以这是一个猜测。

S_ORD 是您表单中的一个块,基于(我希望)一个名为 S_ORD 的表。您发布的代码段正在某个触发器中运行,可能是 POST-QUERY 或 WHEN-VALIDATE-ITEM,尽管这并不重要,并且应该在该块上填充一个名为 PAYMENT_TYPE 的字段。

错误消息告诉您的是,块 S_ORD 没有名为 PAYMENT_TYPE 的字段。(它说“绑定变量”,因为冒号表示绑定变量,我们也可以以相同的方式引用诸如全局变量之类的东西)。

为什么这个领域不存在?任何一个:

  1. 您的表有一个名为 PAYMENT_TYPE 的列,而您在创建块时没有选择它;或者
  2. 您的表没有名为 PAYMENT_TYPE 的列;
  3. 您的数据块不称为 S_ORD。

在第一种情况下,您需要进入块属性编辑器并添加列。在第二种情况下,您需要将一个非基表项添加到您的块中。 在这里了解如何。如果您已将数据块命名为表名以外的其他名称(并且这样做可能有充分的理由),那么您需要在调用中使用块名,而不是表名)。

于 2012-07-05T05:11:56.670 回答