用于矩形棱镜体积计算的PL / SQL BIND变量

时间:2013-02-08 03:26:03

标签: sql oracle plsql

我已经研究过这个问题并让它适用于声明的替换变量,但是我无法正确计算BIND变量。我被告知它与SQL * PLUS和Oracle的开发人员混淆。这是我正确回答的初始问题,但BIND变量部分无法正常工作。 Learning Bind Variables Question

所以我有那个使用替换变量来计算矩形棱镜体积的代码,但是想要使用这样声明的BIND变量。我的教科书说我必须在结束后使用PRINT和打印; / command并没有显示dbms_output,因此可能存在问题。这不是一种非常实用的做事方式,我明白了。

SET SERVEROUTPUT ON
VARIABLE d_length NUMBER;
VARIABLE d_height NUMBER;
VARIABLE d_width NUMBER;

DECLARE 
    d_volume    NUMBER;
BEGIN
    :d_length := &q_length;
    :d_height := &q_height;
    :d_width := &q_width;

    DBMS_OUTPUT.PUT_LINE('The length dimension is: ' || :d_length);
    DBMS_OUTPUT.PUT_LINE('The height dimension is: ' || :d_height);
    DBMS_OUTPUT.PUT_LINE('The width dimension is: ' || :d_width);  

    d_volume := :d_length * :d_height * :d_width;

    DBMS_OUTPUT.PUT_LINE(
        'The rectangular prism volume for the swimming pool is: ' 
           || d_volume);

END;
/

所以我的问题是,如何让它与BIND变量一起工作,我将变量放在块外面作为VARIABLES,然后声明d_volume,执行该计算,并使用这些绑定变量打印游泳池的体积。我在附近,但有些事情已经结束了。它打印出dbms_output语句,但没有显示任何变量。

1 个答案:

答案 0 :(得分:0)

正如the answer to your previous question所述,在APC的评论中,绑定变量在这里没有给你太多,但它似乎是一个练习,所以...你所拥有的代码显示值{{{ 1}}。要改为使用PRINT,您不能在PL / SQL块中声明dbms_output,因为当您退出块时它将超出范围,因此您需要将其设为d_volume }以及:

variable

在SQL * Plus中,VARIABLE d_length NUMBER; VARIABLE d_height NUMBER; VARIABLE d_width NUMBER; VARIABLE d_volume NUMBER; BEGIN :d_length := &q_length; :d_height := &q_height; :d_width := &q_width; :d_volume := :d_length * :d_height * :d_width; END; / print d_length print d_height print d_width print d_volume 删除了一些错误,给出了:

set verify off

奇怪的是,这在SQL Developer(3.1.07或3.2.20)中并不常用;行Enter value for q_length: 3 Enter value for q_height: 4 Enter value for q_width: 5 PL/SQL procedure successfully completed. D_LENGTH ---------- 3 D_HEIGHT ---------- 4 D_WIDTH ---------- 5 D_VOLUME ---------- 60 SQL> 未按预期分配值,因此报告为null。您可以改为:d_volume := :d_length * :d_height * :d_width;,这有点意义,因为它们是“SQL语句中的占位符”。您似乎仍然无法在块中引用select :d_length * :d_height * :d_width into :d_volume from dual;(例如,如果您:d_volume,则报告为空),但它由dbms_output显示。

print

有趣的是,BEGIN :d_length := &q_length; :d_height := &q_height; :d_width := &q_width; select :d_length * :d_height * :d_width into :d_volume from dual; dbms_output.put_line('d_volume inside the block: ' || :d_volume); END; / anonymous block completed d_volume inside the block: D_LENGTH - 3 D_HEIGHT - 4 D_WIDTH - 5 D_VOLUME -- 60 在SQL Developer中显示了类似dbms_output.put_line(':d_volume');的内容;在SQL * Plus中,它显示:ZSqlDevUnIq8