Шаг 73 - PL/SQL - функции PL/SQL осталось немного ...

Вот, совсем забыл (просто склероз, какой то!). При работе с датами, есть функция TO_DATE, которая производит преобразование обратное TO_CHAR при работе с типом DATE. Данная функция, преобразует тип CHAR или VARCHAR2 в тип DATE. Ее синтаксис таков:

TO_DATE(строка_символов, [, формат [, nls_параметр]])

Здесь в данном случае "строка_символов" строка типа CHAR или VARCHAR. Все остальное, как и шаге 71 для TO_CHAR(). Таблица форматов преобразования та же! Пример использования, приведен ниже:

SET SERVEROUTPUT ON

BEGIN
	
	DBMS_OUTPUT.enable;
	
	-- Function  TO_DATE() --
	DBMS_OUTPUT.put_line( TO_CHAR(TO_DATE('12-11-2003', 'DD-MM-YYYY'), 'DD-Month-YYYY'));
					  
END;
/

После запуска получаем:

SQL> SET SERVEROUTPUT ON
SQL> 
SQL> BEGIN
  2  
  3  	DBMS_OUTPUT.enable;
  4  
  5  	-- Function  TO_DATE() --
  6  	DBMS_OUTPUT.put_line( TO_CHAR(TO_DATE('12-11-2003', 'DD-MM-YYYY'), 'DD-Month-YYYY'));
  7  
  8  END;
  9  /
12-Ноябрь  -2003                                                                

Процедура PL/SQL успешно завершена.

Вот так достаточно, интересно сработал формат Month. Месяц выводится с первой прописной, а затем строчные символы. Итак, давайте, наконец, закончим пока с описаниями функций, от которых вы уже, наверное, подустали, но материал, бесспорно очень полезен. Подведем итог, еще несколькими функциями, которые, несомненно, вам пригодятся в дальнейшем. Одна из таких весьма полезных функций следующая:

NVL(выражение 1, выражение 2)

А, вот что она производит: Возвращает "выражение 2", если "выражение 1" является значением NULL. В противном случае возвращает "выражение 1". Если "выражение 1", не является строкой символов, то возвращаемое значение имеет тот же тип данных, что и "выражение 1", иначе возвращаемое. С помощью этой функции очень легко избавиться от NULL в активном наборе запроса. Например, если дать вот такой запрос к таблице SALESREPS нашей учебной БД:

SELECT s.NAME, NVL(s.MANAGER, 0) MANAGER, NVL(s.QUOTA, 0) QUOTA
	   FROM SALESREPS s
/

В результате получим следующее:

SQL> SELECT s.NAME, NVL(s.MANAGER, 0) MANAGER, NVL(s.QUOTA, 0) QUOTA
  2      FROM SALESREPS s
  3  /

NAME                              MANAGER      QUOTA                            
------------------------------ ---------- ----------                            
Вася Пупкин                           104        350                            
Маша Распутина                        106        300                            
Филип Киркоров                        108        350                            
Света Разина                            0        275                            
Наташа Королева                       106        200                            
Игорь Николаев                        104        300                            
Крис Кельми                           101          0                            
Игорь Петров                          106        350                            
Дима Маликов                          104        275                            
Маша Сидорова                         108        300                            
Максим Галкин                         108        400                            

11 строк выбрано.

Хорошо видно, что 4-я и 7-я строка, теперь получили вместо NULL значение 0! Хотя это и нарушает принцип тройственной логики, но, тем не менее, избавляет от лишних хлопот. Вот так можно легко и просто раз и навсегда покончить с NULL-ами! :)

Еще одна довольно интересная функция которая может пригодиться вам в дальнейшем. Функция UID. Синтаксис прост:

UID

Данная функция, возвращает целое число однозначно, идентифицирующая текущего пользователя базы данных. При этом у нее нет аргументов.

SET SERVEROUTPUT ON

BEGIN
	
	DBMS_OUTPUT.enable;	
	-- Function  UID() --
	DBMS_OUTPUT.put_line( TO_CHAR(UID));
					  
END;
/

После запуска получаем:

SQL> SET SERVEROUTPUT ON
SQL>
SQL> BEGIN
  2  
  3  	DBMS_OUTPUT.enable;
  4  	-- Function  UID() --
  5  	DBMS_OUTPUT.put_line( TO_CHAR(UID));
  6  
  7  END;
  8  /
61                                                                              

Процедура PL/SQL успешно завершена.

При этом пользователь у нас MILLER, как вы помните. В чем легко убедиться, введя в SQL*Plus команду SHOW USER:

SQL> SHOW USER
USER имеет значение "MILLER"

Кстати именно для этого есть функция:

USER	

Возвращает значение типа VARCHAR2 содержащее имя текущего пользователя Oracle. Аргументов не имеет.

Пример:

SET SERVEROUTPUT ON

BEGIN
	
	DBMS_OUTPUT.enable;	
	-- Function  UID() --
	DBMS_OUTPUT.put_line( TO_CHAR(UID));

	-- Function  USER() --
	DBMS_OUTPUT.put_line( 'User '||USER||' Uid '||TO_CHAR(UID));

END;
/

Получаем:

SQL> BEGIN
  2  
  3  	DBMS_OUTPUT.enable;
  4  	-- Function  UID() --
  5  	DBMS_OUTPUT.put_line( TO_CHAR(UID));
  6  
  7  	-- Function  USER() --
  8  	DBMS_OUTPUT.put_line( 'User '||USER||' Uid '||TO_CHAR(UID));
  9  
 10  END;
 11  /
61                                                                              
User MILLER Uid 61                                                              

Процедура PL/SQL успешно завершена.

Вот так например, легко сделать что-то вроде аудита! Но это уже ваша фантазия! Еще одна интересная функция:

USERENV(параметр)

Возвращает значение типа VARCHAR2 содержащее сведения о текущем сеансе с учетом "параметр". Значения "параметр" содержит следующая таблица:

Значение "параметр"Поведение функции USERENV
'OSDBA'Если в текущем сеансе разрешена роль OSDBA то возвращается 'TRUE' в противном случае возвращается 'FALSE'. При этом не забывайте, что возвращается VARCHAR2, а не BOOLEAN!
'LANGUAGE'Возвращает язык и территорию, которые используется в этом сеансе, а также набор символов базы данных. Это параметр средства NLS. Возвращаемое значение имеет вид: язык_территория.набор_символов
'TERMINAL'Возвращает идентификатор терминала текущего соединения, зависящий от вида, операционной системы. Для распределенных SQL - операторов возвращается идентификатор локального соединения.
'SESSIONID'Возвращает идентификатор соединения способного выполнить аудит, если параметр инициализации AUDIT_TRAIL установлен в TRUE.
'ENTRYID'Возвращает идентификатор доступного входа способного выполнить аудит, если параметр инициализации AUDIT_TRAIL установлен в TRUE.
'LANG'Возвращает сокращенное название языка, принятого в ISO.

Давайте попробуем это в действии:

SET SERVEROUTPUT ON

BEGIN
	
	DBMS_OUTPUT.enable;	
	-- Function  USER() --
	DBMS_OUTPUT.put_line( 'User '||USER||' Uid '||TO_CHAR(UID));

	-- Function  USERENV() --
	DBMS_OUTPUT.put_line( USERENV('LANGUAGE'));

	-- Function  USERENV() --
	DBMS_OUTPUT.put_line( USERENV('TERMINAL'));

	-- Function  USERENV() --
	DBMS_OUTPUT.put_line( USERENV('SESSIONID'));

	-- Function  USERENV() --
	DBMS_OUTPUT.put_line( USERENV('ENTRYID'));

	-- Function  USERENV() --
	DBMS_OUTPUT.put_line( USERENV('LANG'));
					  
END;
/

Получаем:

SQL> SET SERVEROUTPUT ON
SQL>
SQL> BEGIN
  2  
  3  	DBMS_OUTPUT.enable;
  4  	-- Function  USER() --
  5  	DBMS_OUTPUT.put_line( 'User '||USER||' Uid '||TO_CHAR(UID));
  6  
  7  	-- Function  USERENV() --
  8  	DBMS_OUTPUT.put_line( USERENV('LANGUAGE'));
  9  
 10  	-- Function  USERENV() --
 11  	DBMS_OUTPUT.put_line( USERENV('TERMINAL'));
 12  
 13  	-- Function  USERENV() --
 14  	DBMS_OUTPUT.put_line( USERENV('SESSIONID'));
 15  
 16  	-- Function  USERENV() --
 17  	DBMS_OUTPUT.put_line( USERENV('ENTRYID'));
 18  
 19  	-- Function  USERENV() --
 20  	DBMS_OUTPUT.put_line( USERENV('LANG'));
 21  
 22  END;
 23  /
User MILLER Uid 61                                                              
RUSSIAN_CIS.CL8MSWIN1251                                                        
ORAHOME                                                                         
1592                                                                            
0                                                                               
RU                                                                              

Процедура PL/SQL успешно завершена.

Вот так, действует функция USERENV. Вот собственно, пока все со встроенными функциями PL/SQL. Могу сразу сказать, что мы с вами рассмотрели далеко не все функции, но пока это достаточный минимум для того, чтобы приступить к изучению дальнейшего материала. Можете пока поработать со всем этим, и если есть вопросы, то задавайте!


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Летучий Сергей - 16.11.2003