sql >> Database >  >> RDS >> Oracle

PL/SQL BINDVARIABELEN voor het berekenen van rechthoekig prismavolume

Zoals vermeld op het antwoord op uw vorige vraag , en in de opmerking van APC geven bindvariabelen je hier niet veel, maar het lijkt een oefening te zijn, dus... De code die je hebt geeft de waarden OK weer met dbms_output . PRINT gebruiken in plaats daarvan kunt u d_volume . niet declareren in het PL/SQL-blok omdat het buiten het bereik valt wanneer je het blok verlaat, dus je moet dat een variable maken ook:

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

Die in SQL*Plus, met set verify off om wat rommel te verwijderen, geeft:

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>

Vreemd genoeg werkt dat niet helemaal in SQL Developer (3.1.07 of 3.2.20); de regel :d_volume := :d_length * :d_height * :d_width; wijst geen waarde toe zoals verwacht, dus het wordt gerapporteerd als null. Je kunt select :d_length * :d_height * :d_width into :d_volume from dual; in plaats daarvan, wat logisch is omdat het 'plaatsaanduidingen in SQL-instructies' zijn. Het lijkt erop dat je dan nog steeds niet kunt verwijzen naar :d_volume binnen het blok (d.w.z. het wordt gerapporteerd als null als u dbms_output it), maar het wordt weergegeven door 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

Interessant is dat dbms_output.put_line(':d_volume'); laat iets zien als :ZSqlDevUnIq8 in SQL-ontwikkelaar; in SQL*Plus toont het :d_volume .




  1. Kan ik een atomaire toename in Rails 2.3 doen zonder terug te vallen op SQL?

  2. Werk een kolom in een tabel bij met willekeurig gekozen unieke waarden uit een andere tabel

  3. Een SQL-query in een PHP-functie plaatsen

  4. Mysql-gegevens bijwerken die niet worden verzonden