Oracle Bind 变量、过程和一个令人头疼的问题

Posted

技术标签:

【中文标题】Oracle Bind 变量、过程和一个令人头疼的问题【英文标题】:Oracle Bind Variables, Procedures and a headache 【发布时间】:2014-06-26 05:17:34 【问题描述】:

我想知道您是否可以为我指明正确的方向。我花了最后一点时间试图弄清楚如何在带有声明的块代码中使用绑定变量。我的问题是,每次我尝试在 SQL Developer 中运行代码块时,它都会返回错误“绑定变量“disp”未声明。

在一段非块代码中,我可以获得我期望的结果。以下我知道的作品,我确实得到了结果:

var disp varchar2(200);
begin
    test_procedure('test', 100, :disp);
end;
/
print :disp

上面的代码返回一个值,test100。

但是,如果我尝试将其移动到代码块中,我可以在外部应用程序(Java 或 php)中将其用作单行代码,我开始遇到麻烦。到目前为止我所拥有的是:

declare
    disp varchar2(200);
begin
    test_procedure('test', 100, :disp);
end;
/
print :disp

当我运行上述内容时,我得到:

绑定变量“disp”未声明

我尝试了几种不同的方法,从在声明框中使用 var 到尝试引用程序变量定义,但没有一种方法适合我

【问题讨论】:

【参考方案1】:

您不能在局部变量名称前加上冒号。

declare
    disp varchar2(200);
begin
    test_procedure('test', 100, disp);
end;

是一个有效的 PL/SQL 块。但是,print 是一个 SQL*Plus 命令,因此它仅适用于 SQL*Plus 变量,而不适用于 PL/SQL 块中定义的变量。如果你启用了它,你可以使用dbms_output在PL/SQL中打印值

declare
    disp varchar2(200);
begin
    test_procedure('test', 100, disp);
    dbms_output.put_line( disp );
end;

在 SQL Developer 中,您需要先启用输出(查看 | DBMS 输出以在较新版本的 SQL Developer 中显示窗口)。

dbms_output 不是将数据返回到客户端应用程序的合适方式(或者在您依赖人类查看输出以执行某些操作的情况下执行某些操作)。这是一个非常有用的包,用于进行非常简单的调试或快速概念验证。但是你不应该假设你的代码的调用者已经为dbms_output分配了一个缓冲区来写,或者它有能力读取你写给dbms_output的内容。

【讨论】:

您,先生,是个传奇!谢谢!

以上是关于Oracle Bind 变量、过程和一个令人头疼的问题的主要内容,如果未能解决你的问题,请参考以下文章

软件测试——令人头疼的errors

mysqli_stmt::bind_param():类型定义字符串中的元素数与绑定变量数不匹配

命名管道和分叉令人头疼

Maven、Webstart 和 Java 8 令人头疼的问题

MySQL令人头疼的Aborted告警案例分析

令人费解的差距和孤岛 ORACLE SQL