【问题标题】:bad bind variable : Why bind does not happen inside stored procedure?错误的绑定变量:为什么绑定不会在存储过程中发生?
【发布时间】:2017-12-29 17:35:07
【问题描述】:

为什么以下代码无法编译并出现以下错误。我尝试使用不同的输入 a1NULL 每次运行该块三次。

Name    Null Type         
------- ---- ------------ 
col_nam      VARCHAR2(20) 

编译日志:

Error: PLS-00049: bad bind variable 'x'

代码:

create or replace function ret_bool return boolean is
num_var number;
begin
  select col_nam into num_var from ex04011601 where col_nam=:x; //statement 1
  return true;
end;
/

【问题讨论】:

  • 绑定变量出现在函数体中是没有意义的,因为该语言没有为它提供值的机制。你会如何使用它?

标签: oracle stored-procedures plsql bind


【解决方案1】:

您需要将 X 作为参数传递给您的函数:

create or replace function ret_bool( X IN VARCHAR2)
 return boolean is
num_var number;
begin
  select col_nam into num_var from ex04011601 where col_nam= X; 
  return true;
end;

【讨论】:

  • 我不想锻炼这个街区。我的疑问是为什么我不能在这里使用绑定变量。
  • 我解释了原因。您正在创建一个 pl/sql 函数。该函数在数据库上运行。它对外部变量值一无所知。
  • 所以我想即使在过程规范create or replace procedure proc(:n1 in out number) is 中使用绑定变量,它仍然会有任何参考线索吗?
  • @sql_dummy 如果存在这种语法,我不确定procedure proc(:n1 in out number) 会做什么。有:n1的地方应该有参​​数名。
【解决方案2】:

因为在这种情况下,不能在 PL/SQL 过程的定义中的任何地方引用主变量。

....对于 SQL 语句或 PL/SQL 块中的每个占位符,您必须 调用一个 OCI 例程来绑定你的变量的地址 程序到占位符...

在编译期间,占位符没有可以绑定到其地址的变量(分配内存)。

【讨论】:

    【解决方案3】:

    “我猜即使在过程规范中使用绑定变量procedure proc(:n1 in out number)...

    在某些时候,用户必须提供一个实际值。那是使用绑定变量的地方。

    让我们使用你的函数并使用一个参数作为 PL/SQL:

    create or replace function ret_bool (p_arg in number)
    return boolean is
        num_var number;
    begin
        select col_nam into num_var 
        from ex04011601
        where col_nam= p_arg;
        return true;
    end;
    /
    

    使用绑定变量的正确方法是在调用函数时

    EXEC SQL EXECUTE 
    BEGIN 
      :x := ret_bool(:n);
      ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-09
      • 2017-03-24
      • 2014-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-11
      相关资源
      最近更新 更多