【问题标题】:Oracle "ORA-01008" Error. Variable Not Bound甲骨文“ORA-01008”错误。变量未绑定
【发布时间】: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

【问题讨论】:

    标签: sql oracle plsql


    【解决方案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有什么区别呢?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-22
        • 2021-12-18
        • 2020-05-06
        • 2011-08-06
        • 2010-10-05
        相关资源
        最近更新 更多