Исходники
Статьи
Языки программирования
.NET Delphi Visual C++ Borland C++ Builder C/С++ и C# Базы Данных MySQL MSSQL Oracle PostgreSQL Interbase VisualFoxPro Веб-Мастеру PHP HTML Perl Java JavaScript Протоколы AJAX Технология Ajax Освоение Ajax Сети Беспроводные сети Локальные сети Сети хранения данных TCP/IP xDSL ATM Операционные системы Windows Linux Wap Книги и учебники
Скрипты
Магазин программиста
|
USER(CREATE,ALTER,DROP, Создает, изменяет и удаляет пользователей; BECOME BECOME) требуется для выполнения с помощью утилиты Export полного экспорта базы данных VIEW(CREATE,CREATE ANY, Создает и удаляет представления DROP ANY) 16. Полномочия на объекты В таблице приведены полномочия на объекты (отмечены символом "*"). С помощью ALL (All of the object privileges that can be applied.) Процедуры Предста- Последова- Функции Объекты Таблицы ления тельности Пакеты "Снимки" ALTER * * DELETE * * EXECUTE * INDEX * INSERT * * REFERENCES * * SELECT * * * * UPDATE * * 17. Основные понятия и параметры, используемые в справочнике c_alias - псевдоним столбца (может использоваться в SELECT фразе). cluster - col_element - определение столбца (для формата или элемента столбца в описании CREATE TABLE предложения). condition - условие (возвращает логическое значение TRUE, FALSE или UNKNOWN). constraint - имя ограничения целостности в описании таблицы. dblink - Database link. defoult expr - любое выражение. fmt - формат данных. location - Operating-system-dependent specification of a file's location. Usually either a device or a directory. integer - числовая константа или выражение типа NUMBER. nls - выражение вида 'NLS_SORT = name', где name is either BINARY or the name of a linguistic sort sequence null - неопределенное значение. subquery - подзапрос, используемый в предложениях. rowid - внутренний уникальный идентификатор строки (тип данных ROWID). t_alias - псевдоним таблицы. Может использоваться в SELECT предложении. schema - scn - номер уникальной идентификации транзакции (System Change Number). sid,serial# - Уникальные идентификаторы сессии (Session ID and serial number). M SQL*Plus С О Д Е Р Ж А Н И Е 1. Введение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 2. Ввод и редактирование команд языков SQL*Plus, SQL и PL/SQL . . . . . 4 2.1. Командная строка SQL*Plus . . . . . . . . . . . . . . . . . . . 4 2.2. Использование строкового редактора SQL*Plus . . . . . . . . . . 5 2.3. Использование внешнего (системного) редактора текста . . . . . . 7 2.4. Размещение комментариев в командных файлах . . . . . . . . . . . 7 3. Выполнение командных файлов . . . . . . . . . . . . . . . . . . . . 7 4. Динамически изменяющиеся программы . . . . . . . . . . . . . . . . . 8 4.1. О динамически изменяющихся программах . . . . . . . . . . . . . 8 4.2. Определение подставляемых переменных . . . . . . . . . . . . . . 9 4.3. Управление подстановкой переменных . . . . . . . . . . . . . . . 10 4.4. Различия в использовании префиксов & и && . . . . . . . . . . . 10 4.5. Связь с пользователем и операционной системой . . . . . . . . . 11 5. Сохранение результатов . . . . . . . . . . . . . . . . . . . . . . . 11 6. Изменение окружающей среды . . . . . . . . . . . . . . . . . . . . . 7. Работа с переменными . . . . . . . . . . . . . . . . . . . . . . . . 8. Показ столбцов таблицы . . . . . . . . . . . . . . . . . . . . . . . 9. Проектирование простых отчетов . . . . . . . . . . . . . . . . . . . 10. Соединение с другими базами данных . . . . . . . . . . . . . . . . . 11. Команды SQL*Plus @ (at), @@ Выполняет содержимое указанного командного файла . . . . . / (slash) Запускает команду SQL или блок PL/SQL из буфера SQL . . . ACCept Организует ввод текста в переменную пользователя . . . . . Append Добавляет текст к концу текущей строки в буфере SQL . . . BREak Определяет, какие события вызовут прерывание и какие действия необходимо выполнить в случае прерывания . . . . BTItle Размещает заголовок в конце каждой страницы отчета . . . . Change Изменяет текст текущей строки в буфере SQL . . . . . . . . CLear Очищает описание прерываний, буфер SQL, описание столбцов и т.д. . . . . . . . . . . . . . . . . . . . . . COLumn Позволяет форматировать значения и заголовки столбцов . . Возможно использование следующих параметров: ALIas псевдоним столбца или выражения . . . . . . . . . . CLEar очистка описания столбца . . . . . . . . . . . . . . FOLD_After перевод строки после заголовка и каждой строки . . . FOLD_Before перевод строки перед заголовком и каждой строкой . . FORmat формат показа значений столбца . . . . . . . . . . . HEAding изменение заголовка столбца . . . . . . . . . . . . JUStify выравнивание заголовка столбца . . . . . . . . . . . LIKE копирование параметров показа другого столбца . . . NEWLine вывод значений столбца с новой строки . . . . . . . NEW_Value описание переменной для значения столбца . . . . . . NOPRInt|PRInt выключение или включение печати столбца . . . . . . NULl символ(ы) для изображения NULL-значения . . . . . . ON|OFF включает или отключает признаки показа столбца . . . OLD_Value описание переменной для значения столбца . . . . . . WRApped перенос слишком широкого текста на следующую строку WORd_wrapped аналогично WRAPPED, но без разрыва слов . . . . . . TRUncated округление широких значений с плавающей точкой . . . COMPute Вычисляет и печатает итоговые строки отчета . . . . . . . CONNect Присоединяет заданного пользователя к ORACLE . . . . . . . COPY Копирует данные из таблиц одной базы данных в другую . . . DEFine Определяет пользовательскую переменную . . . . . . . . . . DEL Удаляет текущую строку из буфера SQL . . . . . . . . . . . DESCribe Показывает краткое описание таблицы . . . . . . . . . . . DISConnect Завершает сеанс работы с базой данных (но не с SQL*Plus) . - 2 - EDIT Вызывает системный редактор текста . . . . . . . . . . . . EXEcute Выполняет отдельное утверждение PL/SQL . . . . . . . . . . EXIT Завершает работу SQL*Plus . . . . . . . . . . . . . . . . GET Загружает файл в буфер SQL . . . . . . . . . . . . . . . . HELP Выдает информацию о командах языка SQL*Plus, PL/SQL, SQL . HOst Выполняет команду ОС, не выходя из SQL*Plus . . . . . . . Input Добавляет строку после текущей строки буфера SQL . . . . . List Показывает строки буфера SQL . . . . . . . . . . . . . . . PAUse Показывает заданное сообщение и ожидает нажатия Enter . . PRInt Показывает текущее значение связывающей переменной . . . . PROMPT Посылает на экран сообщение или незаполненную строку . . . REMark Начинает комментарий в командном файле . . . . . . . . . . Run Запускает команду SQL или блок PL/SQL из буфера SQL . . . RUNFORM Запускает команду SQL*Forms . . . . . . . . . . . . . . . SAVe Сохраняет в файле содержимое буфера SQL . . . . . . . . . SET Устанавливает окружающую среду для текущей сессии . . . . Возможно использование следующих параметров: ARRAYsize число строк, выбираемых одновременно из БД . . . . AUTOcommit управляет передачей изменений в БД . . . . . . . . BLOckterminator устанавливает символ, завершающий блок PL/SQL . . CMDSep устанавливает символ, разделяющий команды SQL*Plus COMpatibility определяет версию ORACLE, с которой Вы связаны . . CONcat устанавливает символ, ??? . . . . . . . . . . . . COPYCommit запускает команду COMMIT после копирования N строк DEFine определяет первый символ подставляемой переменной ECHO включает (выключает) эхо для командного файла . . EMBEDDED устанавливает новую страницу для начала отчета . . ESCape устанавливает ESCAPE-символ . . . . . . . . . . . FEEDback устанавливает число высвечиваемых записей запроса FLUsh (не)разрешает вывод сообщений . . . . . . . . . . HEAding (не)разрешает вывод заголовков столбцов . . . . . HEADSep устанавливает символ разделителя заголовков . . . LINesize устанавливает ширину строки . . . . . . . . . . . LONG устанавливает максимальную ширину LONG значений . LONGChunksize устанавливает размер приращений LONG значений . . MAXData устанавливает максимальную ширину строки SQL*Plus NEWPage число строк между нижним и верхним заголовком . . NULL символ(ы) для изображения NULL-значения . . . . . NUMFormat формат (по умолчанию) для вывода числовых значений NUMwidth ширина (по умолчанию) для вывода числовых значений PAGESize устанавливает число строк на странице . . . . . . PAUse показывает сообщение и ожидает нажатия Enter . . . RECSEP установка символа сепаратора и места его вывода . SCAN разрешает обработку подстановки переменной . . . . SERVEROUTput включает (выключает) вывод переменных на экран . . SHOWmode показывает старую и новую установку параметров . . SPAce число пробелов между столбцами при выводе таблицы SQLCase установка регистра для всего выводимого текста . . SQLCOntinue символы подсказки командной строки SQL*Plus . . . SQLNumber подсказка в виде номера строки для продолжения . . SQLPREfix устанавливает символ префикса SQL . . . . . . . . SQLPrompt устанавливает подсказку командной строки . . . . . SQLTerminator устанавливает символ завершения команды SQL . . . SUFfix расширение для имени командного файла для SQL*Plus TAB использование символа табуляции для форматирования TERMout разрешает (запрещает) отображение результата . . . TIme отображает текущее время перед подсказкой . . . . - 3 - TIMIng выдает временную статистику по выполнению команды TRIMout отсекает пробелы в конце каждой выводимой строки . UNDerline устанавливает символ для подчеркивания заголовков VERify выводит команду до и после подстановки переменной WRAp разрешает (запрещает) перенос широких текстов . . SHOw Изображает установку системной переменной . . . . . . . . Отображает параметры: ALL все параметры . . . . . . . . . . . . . . . . . . . . . . BTItle текущее определение BTITLE . . . . . . . . . . . . . . . . ERRors ошибки компиляции хранимой процедуры . . . . . . . . . . . LABEL уровень безопасности для текущей сессии . . . . . . . . . LNO текущий номер строки . . . . . . . . . . . . . . . . . . . PNO текущий номер страницы . . . . . . . . . . . . . . . . . . RELease номер редакции текущей версии ORACLE . . . . . . . . . . . SPOOl является ли текущий вывод буферизированным . . . . . . . . SQLCODE код возврата последней выполненной команды SQL . . . . . . TTItle текущее определение TTITLE . . . . . . . . . . . . . . . . USER имя пользователя . . . . . . . . . . . . . . . . . . . . . SPOol Копирует выходные данные в файл или на системный принтер . SQLPLUS Запускает SQL*Plus . . . . . . . . . . . . . . . . . . . . STArt Выполняет содержимое указанного командного файла . . . . . TIMIng Производит анализ производительности команд . . . . . . . TTItle Размещает заголовок в конце каждой страницы отчета . . . . UNDEFine Удаляет описание заданной пользовательской переменной . . VARiable Объявляет связывающую переменную . . . . . . . . . . . . . WHENEVER Выход из SQL*Plus при возникновении ошибки в команде OSERROR операционной системы . . . . . . . . . . . . . . . . . WHENEVER Выход из SQL*Plus при возникновении ошибки в команде SQLERROR SQL или блоке PL/SQL . . . . . . . . . . . . . . . . . А. Форматирование данных Б. Функции В. Псевдо-столбцы Г. Представления словарей данных Oracle Д. 1. Введение SQL*Plus - это интерактивный, управляемый командами интерфейс с системой Oracle, используемый для работы с базами данных (создание и изменение описания таблиц, ввод и модификация данных, отладка запросов и программ, некоторые ад- министративные функции и т.п.), а также написания несложных отчетов. Для этого существует следующий набор команд: @ ("at" - запуск командного файла), @@ (двойное "at" - запуск вложенного командного файла), / (слэш - запуск команды из буфера SQL), ACCEPT (Принять), APPEND (Добавить),BREAK (Прервать),BTITLE (Заголовок внизу),CHANGE (Изменить), CLEAR (Очистить), COLUMN (Столбец), COMPUTE (Вычислить), CONNECT (Соединить), COPY (Копировать), DEFINE (Определить), DEL (Удалить из буфера), DESCRIBE (Описать), DISCONNECT (Разъединить), EDIT (Редактировать),EXECUTE (Выполнить), EXIT (Выход), GET (Прочитать в буфер), HELP (Организовать помощь), HOST (Вы- полнить команду операционной системы), INPUT (Ввести), LIST (Вывести список), PAUSE (Пауза), PRINT (Печатать), PROMPT (Подсказка), REMARK (Примечание), RUN (Выполнить), SAVE (Сохранить), SET (Установить), SHOW (Показать), SPOOL (Буферизация ввода/вывода), SQLPLUS (Запуск SQL*Plus),START (Запуск командного файла), TIMING (Хронометраж), TTILE (Заголовок внизу), UNDEFINE (Отменить оп- ределение), VARIABLE (Переменная), WHENEVER OSERROR (Организовать обработку - 4 - ошибки операционной системы), WHENEVER SQLERROR (Организовать обработку ошибки выполнения SQL команды). Кроме того, в SQL*Plus можно использовать команды языка SQL и блоки языка PL/SQL, являющегося процедурным расширением SQL Oracle. Большинство примеров, иллюстрирующих использование команд SQL*Plus, будет приводиться по небольшой базе данных пользователя COOK (пароль - SOUP), кратко описанной в учебном пособии: Кириллов В.В., Громов Г.Ю. Структуризированный язык запросов (SQL). - СПб.: ИТМО, 1995. - 92 с. 2. Ввод и редактирование команд языков SQL*Plus, SQL и PL/SQL 2.1. Командная строка SQL*Plus После запуска SQL*Plus (см. команду SQLPLUS) на экране появится приглашение SQL>_ для ввода командной строки. В эту строку можно ввести команду SQL, например, SQL> SELECT Блюдо,Основа FROM Блюда; или блок команд PL/SQL, например, SQL> BEGIN 2 :n := 1; 3 END; 4 . или команду SQL*Plus, например, SQL> COLUMN ((Белки+Углев)*4.1+Жиры*9.3) HEADING 'Калорийность' Если текст команды не помещается на одной строке, то его можно разместить в нескольких строчках (как, кстати, размещен выше блок PL/SQL): SQL> SELECT | SQL> COLUMN - 2 Блюдо,Основа | > ((Белки+Углев)*4.1+Жиры*9.3) - 3 FROM Блюда | > HEADING - 4 ; | > 'Калорийность' В этом случае, каждая незавершенная строка команды SQL*Plus должна заканчи- ваться символом "-", что инициирует вывод подсказки для строки продолжения: по умолчанию это символ ">", который может быть изменен на любой текст с помощью команды SET SQLCONTINUE. Команды SQL и блоки PL/SQL опознаются по ключевому слову (SELECT, DELETE и т.п.) и не требуют символа продолжения перед переходом на другую строку, так как "ждут" символа завершения команды: ";" для команд SQL и "." для - PL/SQL. В данном случае строка продолжения идентифицируется по умолчанию своим поряд- ковым номером. С помощью команды SET SQLNUMBER можно заменить номер на пригла- шение "SQL>", которое также может быть изменено, например, на "Введите команду" с помощью команды SET SQLPROMPT. Если во время ввода команды обнаружена ошибка, которая находится в строке ввода, то для ее исправления можно стереть клавишей Backspace конец текста, включая неправильный текст, и заново ввести правильный его вариант. Если же ошибка обнаружена в предшествующих строках, то придется либо заново вводить всю команду, либо воспользоваться одним из редакторов текста. Дело в том, что текст вводимой (текущей) команды SQL или блока PL/SQL попадает в буфер SQL и - 5 - хранится там до ввода другой команды. Текст буфера может модифицироваться либо с помощью команд редактирования, описанных в п. 2.2, либо с помощью системного редактора, вызываемого командой EDIT (см. п 2.3). Команды же SQL*Plus не запо- минаются в буфере и не могут модифицироваться текстовым редактором. 2.2. Использование строкового редактора SQL*Plus В таблице 2-1 показаны команды, позволяющие проверять, изменять или переза- пускать команды SQL или блоки PL/SQL без их нового ввода. Большинство из них (кроме CLEAR, LIST, RUN и SAVE) воздействуют на единственную строку, называе- мую текущей и помечаемую при просмотре (команда LIST) символом "*". Таблица 2-1 Команды редактирования Команда Абривиатура Назначение ------------ ----------- -------------------------------------------------- APPEND text A text добавляет указанный текст (text) в конец текущей строки CHANGE C/old/new/ заменяет старый текст (old) на новый (new) в текущей строке CHANGE C/text/ удаляет указанный текст (text) из текущей строки CLEAR BUFFER CL BUFF удаляет все строки из буфера SQL DEL (нет) удаляет текущую строку, делая текущей следующую строку INPUT I переводит в режим ввода строк после текущей строки (режим заканчивается вводом пустой строки) INPUT I text добавляет после текущей строки строку, состоящую из текста (text) LIST L проказывает все строки буфера SQL, делая текущей последнюю строку LIST n L n показывает n-ю строку и делает ее текущей LIST m n L m n показывает строки от m-й до n-й, делая текущей n-ю строку RUN или / R или / запускает текущую команду SQL SAVE file SAV file сохраняет содержимое буфера SQL в файле file GET file GET file загружает файл в буфер SQL Например, если был произведен построчный ввод (см. рис. 2.1,а) составляющих команды SELECT Блюдо FROM Блюда WHERE Основа = 'Мясо'; и при этом была допущена ошибка (FRO вместо FROM), то после получения сообще- ния об ошибке ORA-0093: FROM keyword not found where expeated можно вывести с помощью команды LIST (L) содержимое буфера SQL (рис. 2.1,б) с целью его последующей корректировки. Сначала заметим, что в "листинге" (и в буфере SQL) отсутствует точка с за- пятой, завершающая команду SQL. Это упрощает редактирование, позволяя добав- лять в конец команды новую строку без перестановки точки с запятой. Теперь для иллюстрации команд редактирования на рис. 2.1,в - 2.1,д показаны некоторые способы исправления ошибки: добавление символа "M", изменение "FRO" на "FROM" и, наконец, удаление строки с "FRO" и ввод за второй строкой строки со словом "FROM". На рис. 2.1,е показан ввод по команде INPUT (I) нескольких строк для расширения списка выводимой информации, на рис. 2.1,ж - вывод текста буфера SQL и добавление в конец команды фразы "ORDER BY ename", а на рис.2.1,з - "листинг" команды после внесения всех перечисленных изменений. - 6 - а) б) в) г) SQL> SELECT SQL> L SQL> L 3 SQL> L 3 2 Блюдо 1 SELECT 3* FRO 3* FRO 3 FRO 2 Блюдо 4 Блюда 3 FRO SQL> A M SQL> C/FRO/FROM/ 5 WHERE 4 Блюда 3* FROM 3* FROM 6 Основа='Мясо' 5 WHERE 6* Основа='Мясо' д) е) ж) з) SQL> L 3 SQL> L 2 SQL> L SQL> L 3* FRO 2* Блюдо 1 SELECT 1 SELECT 2 Блюдо 2 Блюдо SQL> DEL SQL> I 3 ,Выход 3 ,Выход 3i ,Выход 4 ,Труд 4 ,Труд SQL> L 2 4i ,Труд 5 FROM 5 FROM 2* Блюдо 5i 6 Блюда 6 Блюда SQL> I FROM SQL> 7 WHERE 7 WHERE 8* Основа='Мясо' 8 Основа='Мясо' SQL> I ORDER BY Блюдо 9* ORDER BY Блюдо Рис. 2.1. Использование строкового редактора SQL*Plus После этого можно использовать команду RUN (R) или / для выполнения команды и получения следующего результата: SQL> / Блюдо Выход Труд ---------------- ----- ---- Бастурма 300. 5 Бефстроганов 210 6 Мясо с гарниром 250. 3 Салат мясной 200. 4 Суп харчо 500. 5 Заметим, что при выполнении команды RUN перед выводом результата был бы вы- веден текст команды, аналогичный тексту рис. 2.1,з, на с "R" а не "L" в первой строке. Для сохранения текста исправленной команды (буфера SQL) в файле, например, с именем "dish.sql" следует выполнить команду SQL> SAV dish расширение имени файла "sql", характеризующее его как файл запроса, автомати- чески добавляется системой и может быть изменено на другое, если оно будет яв- но указано в тексте команды (например, dish.zap). Сохраненный запрос можно выполнить с помощью команд "START" или "@", напри- мер, @dish Возможна также пересылка текста запроса из файла в буфер SQL с помощью ко- манды GET, например SQL> GET dish Если не указано расширение имени файла, то SQL*Plus ищет файл с заданным име- нем и расширением SQL (для примера dish.sql). Отредактированный текст буфера - 7 - можно сохранить с помощью команды SAVE и (или) выполнить с помощью команды RUN (R) или /. 2.3. Использование внешнего (системного) редактора текста При выполнении команды SQL> EDIT будет вызван текстовый редактор операционной системы, в который будет помещено содержимое буфера SQL (например, строки 1 - 9 рис. 2.1,з). Редактирование тек- ста буфера ничем не от редактирования любого текста в вызванном редакторе. По окончании редактирования обновленный текст следует сохранить в буфере (команда SAVE текстового редактора) и, если необходимо, в файле (команда SAVE AS... тек- стового редактора). Отредактированную команду SQL можно исполнить введя в ко- мандную строку "R", "/" или "@файл" (файл - имя командного файла, где сохранен текст отредактированной команды). С помощью системного редактора можно создавать и редактировать файлы, сос- тоящие из любых допустимых последовательностей команд SQL, PL/SQL и SQL*Plus, а затем выполнять их с помощью команд "START", "@" или "@@" (см. п. 3). Для создания (редактирования) такого файла, обычно называемого командным файлом, надо выполнить команду SQL> EDIT <имя файла> 2.4. Размещение комментариев в командных файлах Существует три способа ввода комментариев в текст командного файла: команда REMARK SQL*Plus, ввод двух дефисов (--) перед строкой комментария и помещение текста комментария между ограничителями начала (/*) и конца (*/) комментария. REM и -- надо ставить перед каждой строкой многострочных комментариев, а в ограничители можно заключать любое число строк комментария. Команда REM должна появляться в начале строки, а -- может вводиться после текста комментируемой команды или ее части. При этом такие комментарии не могут быть продолжены на следующей строке. Отметим, что строку с командой SQL*Plus нельзя завершать комментариями, на- чинающимися на --, так как - признак незавершенности команды (см. п. 2.1). Примеры: REM Замена заголовка | /* Замена заголовка -- В на Вид_блюда | В на Вид_блюда */ COL В HEA Вид_блюда | COL В HEA Вид_блюда SELECT -- выбрать | SELECT /* выбрать */ Блюдо,Основа,Выход | Блюдо,Основа,Выход FROM Блюда -- из Блюда | FROM Блюда /* из Блюда */ WHERE -- где | WHERE -- где Основа='Мясо' | Основа='Мясо' ORDER BY -- упорядочить по | ORDER BY -- упорядочить по Блюдо; | Блюдо; 3. Выполнение командных файлов Как уже указывалось выше, командные файлы (файлы, содержащие набор команд языков SQL, PL/SQL и SQL*Plus) можно выполнять с помощью команд START, @ или @@. Команды START и @ эквивалентны. В них после имени команды указывается имя командного файла, а затем список аргументов (если они есть). В самих командных файлах параметры, значения которых будут замещаться значениями аргументов из указанного выше списка, должны иметь имена &1, &2, ..., т.е. состоять из сим- - 8 - вола амперсанда (&), за которым следует число. Это число определяет порядковый номер аргумента в списке аргументов команд START или @. Если параметр представляет собой символьное значение или дату, то он должен быть заключен в апострофы. Например, если в таблице Блюда необходимо отыскивать блюдо по основному про- дукту (Основа) и трудоемкости приготовления (Труд), то можно создать командный файл osn_trud.sql с содержимым вида: SELECT БЛ, Блюдо FROM Блюда WHERE Основа = '&1' AND Труд = &2; Если требуется найти овощные блюда с трудоемкостью 3, то можно дать запрос: SQL> START osn_trud "Овощи" 3 или SQL> @osn_trud "Овощи" 3 где аргументы, состоящие из несколько слов и (или) написанные русскими буквами, следует заключать в кавычки. Наконец, если опустить список аргументов, то при определенных условиях (см. п. 4) SQL*Plus запросит значения аргументов при выполнении командного файла. Например, если в файле osn_trud.sql сохранен вариант с параметрами &1 и &2 и их значения еще не определялись в предыдущих вызовах или были удалены командой SET UNDEFINE, то вызов SQL> @osn_trud приведет к появлению запроса Enter value for 1: _ После ввода значения "Овощи" появится запрос на ввод следующего аргумента. А затем может быть показано выполняемое преобразование аргументов (см.SET VERIFY в п. 4) и ответ на запрос, т.е. на экране терминала будет расположены строки: SQL> @osn_trud Enter value for 1: "Овощи" Enter value for 2: 3 old 1: SELECT БЛ, Блюдо FROM Блюда WHERE Основа = '&1' AND Труд = &2 new 1: SELECT БЛ, Блюдо FROM Блюда WHERE Основа = 'Овощи' AND Труд = 3 БЛ Блюдо -- ---------------- 1 Салат летний 17 Морковь с рисом Командный файл может содержать не только команды, но и вызовы командных фай- лов, т.е. допустимы вложенные командные файлы и глубина вложенность не лимити- рована. Когда в процессе выполнения командного файла SQL*Plus встречает коман- ду START файл или @файл, то он начинает поиск указанного файла в текущем ката- логе. Если там его нет, то поиск производится во всех подкаталогах текущего каталога. Команда @@файл отличается от @файл (START файл) только тем, что она отыски- вает вложенные командные файлы только в текущем каталоге и с ее помощью нельзя передать в командный файл значения аргументов. 4. Динамически изменяющиеся программы 4.1. О динамически изменяющихся программах В п. 3 была показана возможность получения различных результатов по одной и той же программе. Еще большие возможности появились бы у пользователя если бы - 9 - он смог динамически изменять не только исходные данные, но и структуру прог- раммы (запроса, командного файла и т.п.). SQL*Plus предоставляет такую возмож- ность с помощью, так называемых, подставляемых переменных. Подставляемую переменную размещают вместо какой-либо части команды SQL или SQL*Plus (списка столбцов, WHERE-фразы и т.п.) и перед выполнением команды вво- дят в переменную тот или иной текст этой части. Текст замещает имя переменной, изменяя тем самым структуру команды. Например, если существуют три переменные var1,var2 и var3, значения которых соответственно равны: "БЛ, Блюдо", "Блюда" и "Основа = 'Овощи'", то по запросу SQL> SELECT &var1 FROM &var2 WHERE &var3; SQL*Plus покажет (или не покажет - см. п. 4.3) преобразование команды old 1: SELECT &var1 FROM &var2 WHERE &var3 new 1: SELECT БЛ, Блюдо FROM Блюда WHERE Основа = 'Овощи' и выдаст следующие результаты БЛ Блюдо -- ---------------- 1 Салат летний 3 Салат витаминный 17 Морковь с рисом 23 Помидоры с луком Если же создана переменная var4 со значением "БЛ, Блюдо FROM Блюда WHERE Основа = 'Овощи'" то по команде SQL> SELECT &var4; может быть показано преобразование команды old 1: SELECT &var4 new 1: SELECT БЛ, Блюдо FROM Блюда WHERE Основа = 'Овощи' и получен результат, аналогичный результату предыдущей команды. Легко заметить, что при размещении переменной в тексте изменяемой команды к ее имени должен быть добавлен префикс & (далее будет рассмотрено и использо- вание другого префикса - &&). Встретив имя переменной с префиксом, SQL*Plus подставляет вместо них значение этой переменной. Замещать можно любой текст команды кроме ее первого слова (имени команды), а также команд строкового редактора текста и команд, где замена бессмысленна, например, REMARK, TIMING и т.п. 4.2. Определение подставляемых переменных Для определения переменных используется команда DEFINE, которая позволяет: 1. Определить текстовую (типа CHAR) переменную пользователя. Например, для задания используемой выше переменной var4 использовалась команда SQL> DEFINE var4 = "БЛ, Блюдо FROM Блюда WHERE Основа = 'Овощи'" . Если присваемое переменной значение - это строка чисто буквенных латинских сим- волов, то ее можно не заключать в кавычки. - 10 - 2. Просмотреть значение и тип всех или указанной переменной. Например, если определены только указанные выше переменные var1 - var4 и надо получить их описание, то надо дать команду DEFINE без аргументов: SQL> DEFINE DEFINE var1 = "БЛ, Блюдо" (CHAR) DEFINE var2 = "Блюда" (CHAR) DEFINE var3 = "Основа = 'Овощи'" (CHAR) DEFINE var4 = "БЛ, Блюдо FROM Блюда WHERE Основа = 'Овощи'" (CHAR) По команде SQL> DEFINE var4 будет выведена последняя строка показанного выше списка, т.е. описание указан- ной в DEFINE переменной var4. При помощи команды DEFINE может быть определена только переменная типа CHAR. Команда ACCEPT дает возможность неявно определить переменную типа NUMBER (см. п. 4.5). 4.3. Управление подстановкой переменных Существует несколько команд, позволяющих изменять стандартные (по умолчанию) режимы показа и подстановки переменных: SET SCAN - разрешает (ON) или запрещает (OFF) подстановку переменных. SET DEFINE - определяет символ подстановки (по умолчанию "&") или действует аналогично SCAN (ON/OFF). SET VERIFY - разрешает (ON) или запрещает (OFF) показ преобразования коман- ды в процессе подстановки переменных (см. п. 4.1). SET CONCAT - определяет разделитель (по умолчанию - точка) текста окончания слова и имени переменной, содержащей начало этого слова. Поясним подробнее проблемы, возникающие при замене значением переменной на- чала, середины или конца какого-либо слова. При дополнении конца слова разде- лителем символов слова и имени переменной является сам символ подстановки (&). При установке переменной в начало или середину слова нельзя без специального разделителя выявить, где же закончилось имя переменной и где начались символы слова. Например, если потребовалось получить из таблицы Продукты сведения о содержании белков, жиров и углеводов в луке и муке, то можно дать запрос SQL> SELECT Продукт,Белки,Жиры,Углев FROM Продукты WHERE Продукт IN ('Лук','Мука'); Используя для "сокращения" текста запроса подставляемую переменную x со значе- нием "ук", преобразуем этот запрос следующим образом SQL> SELECT Продукт,Белки,Жиры,Углев FROM Продукты WHERE Продукт IN ('Л&x.','М&x.а'); Здесь для разделения частей слов и именем подставляемой переменной использова- лись символы "&" и ".". Значение последнего можно изменить командой SET CONCAT. 4.4. Различия в использовании префиксов & и && Если подставляемая переменная не определена к моменту ее использования, то SQL*Plus будет запрашивать значение переменной от пользователя. Например, если не определена переменная x и дана команда SQL> SELECT Продукт,Белки,Жиры,Углев FROM Продукты 2 WHERE Продукт IN ('Л&x.','М&x.а'); - 11 - на экране терминала появится запрос Enter value for x: _ и после ввода значения "ук" вновь появится аналогичный запрос. Когда же вторич- но будет введено значение "ук", команда будет выполнена и на экране сохранятся строки: SQL> SELECT Продукт,Белки,Жиры,Углев FROM Продукты 2 WHERE Продукт IN ('Л&x.','М&x.а'); Enter value for x: "ук" Enter value for x: "ук" old 1: SELECT Продукт,Белки,Жиры,Углев FROM Продукты WHERE Продукт IN ('Л&x.','М&x.а') new 1: SELECT Продукт,Белки,Жиры,Углев FROM Продукты WHERE Продукт IN ('Лук','Мука') ПРОДУКТ БЕЛКИ ЖИРЫ УГЛЕВ ------- ----- ---- ----- Лук 17 8 95 Мука 106 13 732 Если теперь запросить с помощью команды DEFINE список переменных, то среди них не будет переменной x - система не сохраняет значений переменных с префиксом &, введенных с терминала. В тех случаях, когда вводимое значение подставляемой переменной необходимо сохранить, следует использовать префикс &&. Например, SQL> SELECT Продукт,Белки,Жиры,Углев FROM Продукты 2 WHERE Продукт IN ('Л&x.','М&x.а'); Enter value for x: "ук" old 1: SELECT Продукт,Белки,Жиры,Углев FROM Продукты WHERE Продукт IN ('Л&x.','М&x.а') new 1: SELECT Продукт,Белки,Жиры,Углев FROM Продукты WHERE Продукт IN ('Лук','Мука') ... Здесь не потребовалось вторично вводить значения переменной x, так как оно сохранилось в памяти системы после первого ввода. 4.5. Связь с пользователем и операционной системой В предыдущем пункте было показано, как SQL*Plus запрашивает от пользователя ввода значения неопределенной подставляемой переменной. Кроме этого SQL*Plus имеет еще три команды для организации связи с пользователем: PROMPT - выдает на экран заданное сообщение или подсказку для пользователя, ACCEPT - запрашивает значение текстовой или числовой переменной, PAUSE - выдает на экран заданное сообщение и ожидает нажатия клавиши Enter. Существует команда HOST, позволяющая выполнять командную строку операцион- ной системы без выхода из SQL*Plus. Синтаксис и примеры использования всех этих команд приведены в их описании. CREATE TABLE dept (deptno NUMBER(2) CONSTRAINT pk_dept PRIMARY KEY, dname VARCHAR2(14), loc VARCHAR2(13) ) CREATE TABLE emp (empno NUMBER(4) CONSTRAINT pk_emp PRIMARY KEY, ename VARCHAR2(10), job VARCHAR2(9), mgr NUMBER(4), hiredate DATE, sal NUMBER(7,2), comm NUMBER(7,2), deptno NUMBER(2) CONSTRAINT fk_deptno REFERENCES emp ) CREATE TABLE bonus (ename VARCHAR2(10), job VARCHAR2(9), sal NUMBER, comm NUMBER ) CREATE TABLE salgrade (grade NUMBER, losal NUMBER, hisal NUMBER ) SELECT * FROM dept DEPTNO DNAME LOC ------- ---------- --------- 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON SELECT * FROM emp EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ----- ------- --------- ------ --------- ------ ------ ------- 7369 SMITH CLERK 7902 17-DEC-80 800 20 7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30 7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30 7566 JONES MANAGER 7839 02-APR-81 2975 20 7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30 7698 BLAKE MANAGER 7839 01-MAY-81 2850 30 7782 CLARK MANAGER 7839 09-JUN-81 2450 10 7788 SCOTT ANALYST 7566 19-APR-87 3000 20 7839 KING PRESIDENT 17-NOV-81 5000 10 7844 TURNER SALESMAN 7698 08-SEP-81 1500 30 7876 ADAMS CLERK 7788 23-MAY-87 1100 20 7900 JAMES CLERK 7698 03-DEC-81 950 30 7902 FORD ANALYST 7566 03-DEC-81 3000 20 7934 MILLER CLERK 7782 23-JAN-82 1300 10 SELECT * FROM salgrade GRADE LOSAL HISAL ----- ----- ----- 1 700 1200 2 1201 1400 3 1401 2000 4 2001 3000 5 3001 9999 |
Форум Программиста
Новости Обзоры Магазин Программиста Каталог ссылок Поиск Добавить файл Обратная связь Рейтинги
|