ORA-01006: 执行选择时绑定变量

Posted

技术标签:

【中文标题】ORA-01006: 执行选择时绑定变量【英文标题】:ORA-01006: Bind Variable while Executing Select 【发布时间】:2019-09-30 21:42:10 【问题描述】:

在新创建的包的初始化块期间,我在存储在关联数组(由 VARCHAR2 索引)中的记录中填充一个字段。然后我遍历关联数组以将第二个字段存储在每条记录上。这些记录存储表名和给定表的外键列名。 (我们的产品有一个通用的形式,所以我以后可以生成一些 SQL,唯一的区别是表名和列名)。下面是一些示例代码:

CREATE OR REPLACE PACKAGE BODY pk_example IS
  TYPE pkt_TableInfo IS RECORD
  (
    BaseTable VARCHAR2(30),
    FKColumn VARCHAR2(30)
  );
  TYPE pkt_TableInfoTable IS TABLE OF pkt_TableInfo INDEX BY VARCHAR2(30);
  pk_tTableInfo pkt_TableInfoTable;
  pk_sIndex VARCHAR2(30);

/***FUNCTION AND PROCEDURE DEFINITIONS***/

--Initialization Section
BEGIN
  pk_tTableInfo('TABLE_A').BaseTable := 'TABLE_B';
  pk_tTableInfo('TABLE_C').BaseTable := 'TABLE_D';

  pk_sIndex := pk_tTableInfo.FIRST;
  WHILE pk_sIndex IS NOT NULL LOOP
    SELECT acc.column_name
    INTO pk_tTableInfo(pk_sIndex).FKColumn
    FROM all_constraints ac
    INNER JOIN all_constraints ac2 ON ac.r_owner = ac2.owner AND ac.r_constraint_name = ac2.constraint_name
    INNER JOIN all_cons_columns acc ON ac.owner = acc.owner AND ac.constraint_name = acc.constraint_name
    WHERE ac.owner = sys_context('userenv', 'current_schema')
    AND ac.constraint_type = 'R'
    AND ac.table_name = pk_sIndex
    AND ac2.table_name = pk_tTableInfo(pk_sIndex).BaseTable;

    pk_sIndex := pk_tTableInfo.NEXT(pk_sIndex);
  END LOOP;
END pk_example;

一切都编译得很好,但是,每当我尝试从这个包运行一个函数时,我都会收到一个指向“SELECT acc.column_name”行的“ORA-01006:绑定变量不存在”错误。

现在是踢球者。这在我的开发环境中有效,但当我尝试在 QA 中运行包时失败。

我拥有所有相同的权限,并且可以正常运行查询。事实上,如果我用字符串 'TABLE_B' 替换 pk_tTableInfo(pk_sIndex) 查询运行得很好。 (对于第一次通过循环......然后我得到没有数据) 环境之间的外键相同。 两个环境都运行 Oracle 12cR2。

感谢您抽出宝贵时间阅读本文,感谢您提供任何意见。

【问题讨论】:

在 12CR2 中,列名可以超过 30 个字符。用 FKcolumn number(128) 重新定义你的类型 @Tejash:虽然我们的应用程序在 12c 上运行,但它最初是在更早的 Oracle 版本上开发的,因此所有表和列名仍然遵守 30 个字符的限制。但是,不想忽略对我的问题的唯一评论,我试了一下,但仍然出现错误。 【参考方案1】:

我刚刚遇到了同样的问题。我有FOR..LOOP 光标,我在FOR 行上收到ORA-01006 错误。查询不是动态的。它在 Oracle 11g 上运行良好,但我们将 Oracle 升级到 19c 版本并出现了这个问题。 唯一可疑的是查询使用了WHERE 子句中的函数。幸运的是它没有引用任何列,所以我将它从查询中删除并在 FOR..LOOP 语句之前计算到变量中。之后它就像魔术一样工作。

在您的情况下,我会尝试摆脱对集合的引用并仅使用标量变量,然后将它们分配给集合元素。 pk_tTableInfo(pk_sIndex).BaseTable 值也是如此。

【讨论】:

以上是关于ORA-01006: 执行选择时绑定变量的主要内容,如果未能解决你的问题,请参考以下文章

如何解决程序中的 ORA-01006?

如何在程序中解决ORA-01006?

努力在 C# 中使用绑定变量

在 SYS_REFCURSOR 中执行动态 sql 语句

绑定变量窥测(Bind Variable Peeking)

Oracle绑定变量窥探