2013-02-08 40 views
0

我已经研究过这个问题,并且已经为声明的替换变量正常工作,但是我无法正确计算BIND变量。我被告知它让SQL * PLUS和Oracle的开发人员感到困惑。这是我的第一个问题被正确回答,但BIND变量部分不起作用。 Learning Bind Variables Question用于矩形棱镜体积计算的PL/SQL BIND VARIABLES

所以我有代码,它使用替代变量计算矩形棱镜的体积,但想要使用像这样声明的BIND变量。我的教科书说,我必须使用PRINT并在结束后打印; /命令,并且不显示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; 
/

所以我的问题是,如何得到它的使用绑定变量的,在这里我把变量块作为变量外出打工,然后声明d_volume,执行计算,并打印出游泳池的容积使用这些绑定变量。我在这附近,但有些事情是关闭的。它打印出dbms_output语句,但不显示任何变量。

+3

绑定变量是SQL语句中的占位符。这里没有SQL,所以它根本不清楚你的最终目标是什么。 – APC

回答

0

the answer to your previous question所述,在APC的评论中,绑定变量在这里并没有给你太多,但它似乎是一个练习,所以......你所拥有的代码显示的值为dbms_output。要使用PRINT相反,你不能在PL/SQL块声明d_volume,因为它会超出范围,当您退出该块,所以你需要一个variable还有:

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 

哪在SQL * Plus,以set verify off去除一些多余的内容,给出了:

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> 

奇怪的是,做在SQL Developer中(07年3月1日或3.2.20)不太工作;行:d_volume := :d_length * :d_height * :d_width;没有按预期分配值,所以报告为空。你可以用select :d_length * :d_height * :d_width into :d_volume from dual;来代替,这是有道理的,因为它们是'SQL语句中的占位符'。看来你仍然不能在块内参考: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 

有趣的是,dbms_output.put_line(':d_volume');显示像在SQL Developer中:ZSqlDevUnIq8;在SQL * Plus中,它显示:d_volume