【问题标题】:PL/SQL BIND VARIABLES for Rectangular Prism Volume CalculationPL/SQL BIND VARIABLES 用于矩形棱柱体积计算
【发布时间】:2013-02-08 19:57:35
【问题描述】:

我已经解决了这个问题,并让它在声明的替换变量上正常工作,但我无法让它为 BIND 变量正确计算。我被告知它与 SQL*PLUS 和 Oracle 的开发人员混淆了。这是我最初回答正确的问题,但 BIND 变量部分不起作用。 Learning Bind Variables Question

所以我有使用替换变量计算矩形棱镜体积的代码,但想使用像这样声明的 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;
/

所以我的问题是,如何让它与 BIND 变量一起使用,我将变量放在块之外作为 VARIABLES,然后声明 d_volume,执行该计算,并使用这些绑定变量打印出游泳池的体积.我就在这附近,但有些不对劲。它打印出 dbms_output 语句,但不显示任何变量。

【问题讨论】:

  • 绑定变量是 SQL 语句中的占位符。这里没有 SQL,所以真的一点都不清楚你的最终目标是什么。

标签: sql oracle plsql


【解决方案1】:

正如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(3.1.07 或 3.2.20)中不太适用; :d_volume := :d_length * :d_height * :d_width; 行未按预期分配值,因此报告为 null。您可以改为使用select :d_length * :d_height * :d_width into :d_volume from dual;,这很有意义,因为它们是“SQL 语句中的占位符”。看来你仍然不能在块内引用:d_volume(即,如果你dbms_output它,它会被报告为null),但它由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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-06
    相关资源
    最近更新 更多