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: 执行选择时绑定变量的主要内容,如果未能解决你的问题,请参考以下文章