错误49错误绑定变量oracle表单

时间:2012-07-05 03:39:57

标签: sql forms oracle variables bind

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

   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 个答案:

答案 0 :(得分:2)

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

以下是Oracle Forms(6i)帮助的引用:

  

您可以使用内置的NAME_IN和COPY间接引用项目   子程序。 NAME_IN函数返回指示的内容   变量或项目。使用NAME_IN函数获取an的值   项目没有直接引用该项目。下列   陈述是等价的:

     

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函数无法返回全局或本地的内容   变量

     

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

     

COPY程序COPY程序为指定值指定   指示的变量或项目。与标准PL / SQL分配不同,   但是,使用COPY程序可以间接引用   正在设置其值的项目:

     

:emp.ename:='smith'; - 直接参考   复制( 'SMITH', 'emp.ename'); - 间接参考

     

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

     

/ *将值'smith'放在名称存储在ref_item * /的项目中   复制( '史密斯',Name_In( 'control.ref_item'));

     

为何使用间接参考
  间接引用项目允许您   编写更通用,可重用的代码。通过使用变量代替   实际的项目名称,你可以编写一个可以在任何项目上运行的子程序   已将其名称分配给指定变量的项目。也,   当您引用a的值时,必须使用间接引用   在PL / SQL中形成绑定变量(项,参数,全局变量)   你在图书馆或菜单模块中写。因为图书馆,菜单,   和表单是单独的应用程序模块,您不能直接引用   到菜单项命令或库中的表单项的值   过程

答案 1 :(得分:1)

一个简单的答案 -

在Oracle表单中

 :S_ORD.payment_type

意味着您的DATA_BLOCK名为S_ORD,其element(可能是TEXT ITEM)名为PAYMENT_TYPE

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

CURSOR c_pymnt_type IS
 SELECT payment_type
   FROM S_ORD;

然后OPENFETCHCLOSE过程中的光标。

答案 2 :(得分:0)

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

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

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

为什么不存在该字段?之一:

  1. 您的表有一个名为PAYMENT_TYPE的列,您在创建块时没有选择它;或
  2. 您的表没有名为PAYMENT_TYPE;
  3. 的列
  4. 您的数据块未被称为S_ORD。
  5. 在第一种情况下,您需要进入块属性编辑器并添加列。在第二种情况下,您需要向块中添加非基表项。 Find out how here。如果您已将数据块命名为除表名之外的其他内容(并且可能有充分理由这样做),那么您需要在调用时使用块nam,而不是表名。)

答案 3 :(得分:0)

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

中的Oracle教程

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

这适用于oracle表单10。