sql >> Database >  >> RDS >> Oracle

Bindvariabelen leren in PL/SQL samen met berekeningsinvoer en -uitvoer DBMS_OUTPUT.PUT_LINE

Bind variabelen en substitutievariabelen zijn verschillende dingen, dus de probleemstelling is misleidend. En dat is nog maar de SQL*Plus-versie van bindvariabelen; het kan een iets andere (of in ieder geval minder voor de hand liggende) betekenis hebben voor de parser.

In wezen verwar je PL/SQL-variabelen met SQL*Plus-substitutievariabelen. Wanneer u verwijst naar &d_length u definieert een substitutievariabele en de gebruiker wordt op dat moment om zijn waarde gevraagd. Maar het is volledig onafhankelijk van de d_length in de PL/SQL DECLARE blok.

U kunt de ACCEPT commando voor een nette manier om waarden van de gebruiker te krijgen voordat je begint met blokkeren, maar je kunt het ook als volgt doen:

SET SERVEROUTPUT ON
DECLARE
    d_length    NUMBER := &q_length;
    d_height    NUMBER := &q_height;
    d_width     NUMBER := &q_width;
    d_volume    NUMBER;
BEGIN
    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);

   DBMS_OUTPUT.PUT_LINE(
       'The dimensions of the swimming pool are ' || '?');
END;
/

Weet u niet zeker wat u wilt dat de laatste regel van de uitvoer laat zien; is dat anders dan de drie dimensies die al zijn getoond?

Je kunt het ook doen met bindvariabelen door ze te definiëren met de VARIABLE commando :

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);

   DBMS_OUTPUT.PUT_LINE(
       'The dimensions of the swimming pool are ' || '?');
END;
/

Merk op dat d_length , d_height en d_width worden in deze versie voorafgegaan door een dubbele punt, omdat dit bindvariabelen zijn. Maar d_volume is niet omdat dat nog steeds wordt gedeclareerd in het PL/SQL-blok. En de werkelijke waarden worden nog steeds van de gebruiker opgehaald als vervangingsvariabelen. Dit is echter een beetje ingewikkeld; variabelen laten binden voegt hier eigenlijk niets toe.




  1. Oracle - de functie to_number toepassen op een varchar-kolom

  2. Hoe gebruik je het broncommando van MySQL om grote bestanden in Windows te importeren?

  3. Een SSIS-pakket maken - om gegevens van Oracle naar SQL Server te kopiëren

  4. Waarom zou een IN-voorwaarde langzamer zijn dan =in sql?