0

私はこの質問に取り組み、宣言された置換変数に対して適切に機能させましたが、BIND変数に対して適切に計算するのに問題があります。SQL*PLUSやOracleの開発者と混同していると言われています。これが正しく答えられた私の最初の質問ですが、BIND変数部分が機能していません。 バインド変数の学習質問

したがって、置換変数を使用して長方形プリズムの体積を計算するコードがありますが、このように宣言された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ステートメントを出力しますが、変数については何も表示しません。

4

1 に答える 1

0

前の質問への回答とAPCのコメントに記載されているように、ここではバインド変数はあまり効果がありませんが、演習のようです。したがって、コードはOKで値を表示しますdbms_output。代わりに使用するには、ブロックを終了するとスコープ外になるため、PL / SQLブロックでPRINT宣言することはできません。そのため、次のようにする必要があります。d_volumevariable

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(つまり、参照した場合はnullとして報告されます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

興味深いことに、 SQLDeveloperのdbms_output.put_line(':d_volume');ようなものを示してい:ZSqlDevUnIq8ます。SQL * Plusでは、が表示されます:d_volume

于 2013-02-08T09:00:09.400 に答える