甲骨文“ORA-01008”错误。变量未绑定

Posted

技术标签:

【中文标题】甲骨文“ORA-01008”错误。变量未绑定【英文标题】:Oracle "ORA-01008" Error. Variable Not Bound 【发布时间】:2013-11-06 05:39:52 【问题描述】:

我刚刚开始使用PL/SQL 并编写了一个简单的基础代码。没看懂,代码有什么问题。

DECLARE
role_test varchar(40) := 'Programmer';
BEGIN
update veer_test set project_id=1008420 where role=:role_test;
END;

我收到ORA-01008: not all variables bound

我之前尝试过:

DECLARE
role varchar(40) := 'Programmer';
BEGIN
update veer_test set project_id=1008420 where role=role;
END;

这更新了表格的所有行。嗯,这是有道理的。但是,如果我想使用与表中相同的变量名怎么办。我也试过了:

role=:role;

但同样的错误ORA-01008

【问题讨论】:

【参考方案1】:

试试:

DECLARE
role_test varchar(40) := 'Programmer';
BEGIN
update veer_test set project_id=1008420 where role=role_test;
END;

【讨论】:

但是为什么我不能使用与表中相同的变量名?说role。那么:role_testrole_test有什么区别呢? @Veer 这不是动态 SQL。更多详情:SO: Use of bind variable【参考方案2】:

如果您想使用与列名相同的变量名,您可以尝试使用这样的过程,

CREATE OR REPLACE PROCEDURE role_p(role VARCHAR2)
IS
BEGIN
     UPDATE veer_test SET project_id=1008422 WHERE role = role_p.role;
END;

执行:

EXECUTE role_p('Programmer');

【讨论】:

【参考方案3】:

您可以咨询v$reserved_words,以确定是否可以在PL/SQL 中使用ROLE 等特定词:

select res_attr from v$reserved_words where keyword = 'ROLE';

这个语句返回一行的事实表明ROLE确实是一个关键字,因此不能在PL/SQL中使用。然而,res_attr_N,这表明该词可以在表中用作属性名称。

另见v$reserved_words on tahiti.oracle.com

【讨论】:

【参考方案4】:

你试试

DECLARE
role_test varchar(40) := 'Programmer';
BEGIN
update veer_test set project_id=1008420 where role=role_test;
END;

愿这一切顺利

【讨论】:

但是为什么我不能使用与我的表中相同的变量名呢?说role。那么:role_testrole_test有什么区别呢?

以上是关于甲骨文“ORA-01008”错误。变量未绑定的主要内容,如果未能解决你的问题,请参考以下文章

ORA-01008: 并非所有变量都已绑定

ORA-01008: 并非所有变量都已绑定

java.sql.SQLException: ORA-01008: 并非所有变量都使用 Mybatis 3 绑定

ORA-01008: 并非所有变量都绑定。他们被束缚

将参数传递给 callableSatament - ORA-01008: 并非所有变量都绑定

OracleCommand 查询其中的空参数 - ORA-01008:并非所有变量都绑定