Итак, ваш первый "курсор" в области SGA, совершив работу, выдал "Hello World!". Как он это сделал вы уже, наверное, успели немного разобраться! Давайте двигаться дальше. В прошлый раз мы просто вывели текст на экран и все проверив работу мантры! :) Но от таких программ мало толку и по этому давайте сделаем что-то полезное. Как правило, самой простой программой, которой обычно начинают изучать какой либо язык, является калькулятор! Конечно же писать калькулятор на языке PL/SQL - это излишество, но для начала вполне приемлемо! Итак, давайте разберем пару блоков PL/SQL:
SET SERVEROUTPUT ON -- Need first start DECLARE A INTEGER; B INTEGER; BEGIN A := 3; B := 5; DBMS_OUTPUT.enable; DBMS_OUTPUT.put_line(A+B); END; /
Получаем следующее:
SQL> SET SERVEROUTPUT ON -- Need first start SQL> DECLARE 2 3 A INTEGER; 4 B INTEGER; 5 6 BEGIN 7 8 A := 3; 9 B := 5; 10 11 DBMS_OUTPUT.enable; 12 DBMS_OUTPUT.put_line(A+B); 13 14 END; 15 / 8 PL/SQL procedure successfully completed
Давайте разбирать. В разделе DECLARE мы обьявили две переменных - A и B. Все переменные объявляются между оператором DECLARE и BEGIN! Затем в теле блока мы присвоили значениям переменных числа 3 и 5. Инициализация переменных может производиться либо при объявлении, либо в теле блока! Как вам больше нравиться! Например, можно было сделать вот так:
DECLARE A INTEGER := 3; B INTEGER := 7; BEGIN . .
Далее при выводе результата мы прямо в теле метода put_line объявили сумму двух переменных. Но вернее было бы провести явное преобразование типа с помощью функции TO_CHAR() вот так:
DBMS_OUTPUT.enable; DBMS_OUTPUT.put_line(TO_CHAR(A+B));
В первом примере мы не сделали ошибки, а произошло неявное преобразование типа. Но мой совет делать именно так. Будет лучше читаться и меньше будете путаться! В данном случае можно записать более сложное выражение для наглядности и я думаю вам станет яснее почему я так делаю:
DECLARE A INTEGER := 3; B INTEGER; K VARCHAR2(2) := '12'; BEGIN B := 5; DBMS_OUTPUT.enable; DBMS_OUTPUT.put_line(TO_CHAR(TO_NUMBER(K)*A+B)); END; /
Получаем следующее:
SQL> DECLARE 2 3 A INTEGER := 3; 4 B INTEGER; 5 K VARCHAR2(2) := '12'; 6 7 BEGIN 8 9 B := 5; 10 11 DBMS_OUTPUT.enable; 12 DBMS_OUTPUT.put_line(TO_CHAR(TO_NUMBER(K)*A+B)); 13 14 END; 15 / 41 PL/SQL procedure successfully completed
Хорошо виден приоритет унарных операций 12*3+5 = 41 - верно. Функция TO_NUMBER(), преобразует строковый литерал K в числовой литерал. С этими функциями преобразования мы еще не раз встретимся и, смею вас заверить, их очень много и будем разбирать их последовательно, так будет проще. Так же я разнообразно инициализировал переменные, что тоже не плохо, но лучше делать это одним способом, код будет более читаем. К стати можно записать и так:
DBMS_OUTPUT.enable; DBMS_OUTPUT.put_line(TO_CHAR(K*A+B));
Но все же явное преобразование более понятно, и не теряйте чувство реальности! Давайте более ближе посмотрим на литералы. Например можно записать:
DECLARE A VARCHAR2(1) := ' '; B VARCHAR2(128) := 'Hello World!!!'; C VARCHAR2(128) := 'How ''are'' you?'; D VARCHAR2(128) := 'Hello Bob - "ok"!'; E VARCHAR2(128) := '12345'; F VARCHAR2(128) := '01/01/1989'; G VARCHAR2(128) := '!@#$%^&*()_":;<,.?'; H VARCHAR2(128) := ''' '''; I NUMBER := 12345; J NUMBER := -12345; K NUMBER := 12345.023745; L NUMBER := 100.; M NUMBER := 1.0237E2; N NUMBER := 1.0237E-2; O NUMBER := 0.34223; P NUMBER := .321434; BEGIN DBMS_OUTPUT.enable; DBMS_OUTPUT.put_line(A); DBMS_OUTPUT.put_line(B); DBMS_OUTPUT.put_line(C); DBMS_OUTPUT.put_line(D); DBMS_OUTPUT.put_line(E); DBMS_OUTPUT.put_line(F); DBMS_OUTPUT.put_line(G); DBMS_OUTPUT.put_line(H); DBMS_OUTPUT.put_line(TO_CHAR(I)); DBMS_OUTPUT.put_line(TO_CHAR(J)); DBMS_OUTPUT.put_line(TO_CHAR(K)); DBMS_OUTPUT.put_line(TO_CHAR(L)); DBMS_OUTPUT.put_line(TO_CHAR(M)); DBMS_OUTPUT.put_line(TO_CHAR(N)); DBMS_OUTPUT.put_line(TO_CHAR(O)); DBMS_OUTPUT.put_line(TO_CHAR(P)); END; /
Получаем следующее:
SQL> DECLARE 2 3 A VARCHAR2(1) := ' '; 4 B VARCHAR2(128) := 'Hello World!!!'; 5 C VARCHAR2(128) := 'How ''are'' you?'; 6 D VARCHAR2(128) := 'Hello Bob - "ok"!'; 7 E VARCHAR2(128) := '12345'; 8 F VARCHAR2(128) := '01/01/1989'; 9 G VARCHAR2(128) := '!@#$%^&*()_":;<,.?'; 10 H VARCHAR2(128) := ''' '''; 11 12 I NUMBER := 12345; 13 J NUMBER := -12345; 14 K NUMBER := 12345.023745; 15 L NUMBER := 100.; 16 M NUMBER := 1.0237E2; 17 N NUMBER := 1.0237E-2; 18 O NUMBER := 0.34223; 19 P NUMBER := .321434; 20 21 BEGIN 22 23 DBMS_OUTPUT.enable; 24 25 DBMS_OUTPUT.put_line(A); 26 DBMS_OUTPUT.put_line(B); 27 DBMS_OUTPUT.put_line(C); 28 DBMS_OUTPUT.put_line(D); 29 DBMS_OUTPUT.put_line(E); 30 DBMS_OUTPUT.put_line(F); 31 DBMS_OUTPUT.put_line(G); 32 DBMS_OUTPUT.put_line(H); 33 34 DBMS_OUTPUT.put_line(TO_CHAR(I)); 35 DBMS_OUTPUT.put_line(TO_CHAR(J)); 36 DBMS_OUTPUT.put_line(TO_CHAR(K)); 37 DBMS_OUTPUT.put_line(TO_CHAR(L)); 38 DBMS_OUTPUT.put_line(TO_CHAR(M)); 39 DBMS_OUTPUT.put_line(TO_CHAR(N)); 40 DBMS_OUTPUT.put_line(TO_CHAR(O)); 41 DBMS_OUTPUT.put_line(TO_CHAR(P)); 42 43 END; 44 / Hello World!!! How 'are' you? Hello Bob - "ok"! 12345 01/01/1989 !@#$%^&*()_":;<,.? ' ' 12345 -12345 12345,023745 100 102,37 ,010237 ,34223 ,321434 PL/SQL procedure successfully completed
Итак строковые литералы могут быть типов CHAR, VARCHAR2. В строковых литералах компилятор различает регистры символов. Давайте посмотрим, что здесь и как! Строковые литералы:
A VARCHAR2(1) := ' '; -- пробел B VARCHAR2(128) := 'Hello World!!!'; -- строка C VARCHAR2(128) := 'How ''are'' you?'; -- строка с выводом символа ' D VARCHAR2(128) := 'Hello Bob - "ok"!'; -- строка с выводом символа " E VARCHAR2(128) := '12345'; -- это не число, это строка F VARCHAR2(128) := '01/01/1989'; -- это не дата, это строка. хотя похоже! G VARCHAR2(128) := '!@#$%^&*()_":;<,.?'; -- литералы могут содержать и специальные символы! H VARCHAR2(128) := ''' '''; -- строка содержит три символа "' '" -- (одинарная кавычка, пробел одинарная кавычка)
Числовые литералы:
I NUMBER := 12345; -- целое число J NUMBER := -12345; -- отрицательное число K NUMBER := 12345.023745; -- плавающая точка L NUMBER := 100.; -- с нулевой точностью M NUMBER := 1.0237E2; -- научная запись N NUMBER := 1.0237E-2; -- отрицательная степень O NUMBER := 0.34223; -- ведущий ноль не нужен! P NUMBER := .321434; -- можно и так!
Хорошим стилем программирования является объявление и инициализация переменных. Если инициализировать переменную, нет необходимости, то инициализацию можно опустить. Типы переменных мы уже рассматривали, все они применимы при их объявлении. Так что, можете с этим поэкспериментировать и проверить все ли так как я вам рассказал! :) Далее мы еще вернемся к созданию программы калькулятора.