Oracle
 sql >> база данни >  >> RDS >> Oracle

PL/SQL BIND VARIABLES за изчисляване на обема на правоъгълна призма

Както е отбелязано в отговорът на предишния ви въпрос , и в коментара на APC променливите за свързване не ви дават много тук, но изглежда е упражнение, така че... Кодът, който имате, показва стойностите OK с dbms_output . За да използвате PRINT вместо това не можете да декларирате d_volume в блока PL/SQL, тъй като ще бъде извън обхвата, когато излезете от блока, така че трябва да го направите 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; не присвоява стойност според очакванията, така че се отчита като нула. Можете да направите select :d_length * :d_height * :d_width into :d_volume from dual; вместо това, което има известен смисъл, тъй като те са „заместители в SQL изрази“. Изглежда, че все още не можете да посочите :d_volume в рамките на блока (т.е. докладва се като нула, ако dbms_output it), но се показва от 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'); показва нещо като :ZSqlDevUnIq8 в SQL Developer; в SQL*Plus показва :d_volume .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle:годината трябва да е между -4713 и +9999, а не 0

  2. Извличане на редове от DB, включително зависими редове

  3. Форматиране на колона за дата в javaFX TableView за данни, извлечени от Oracle DB

  4. Преобразуване на Unix Timestamp в стойност на дата в Oracle

  5. Как да използвам параметри в клауза 'where value in...'?