Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
96
Добавлен:
15.06.2014
Размер:
11.96 Mб
Скачать

3.2.5 Системные хранимые процедуры

MS SQL-server предоставляет большой диапазон системных хранимых процедур, которые выполняют разнообразные системные функции. Рассмотрим некоторые из них [].

sp_addapprole- создание роли приложения.

sp_addlinkedsrvlogin– регистрация пользователей на удаленном сервере.

sp_addlogin- создание новой учетной записи.

sp_addmessage- формирование сообщения об ошибке.

sp_addrolemember- добавление новой роли в БД.

sp_addtype- добавление нового пользовательского типа в БД.

sp_adduser- связывание учетной записи с пользователем БД.

sp_attach_db- присоединение отсоединенной БД.

sp_bindefault– связывания умолчания со столбцом таблицы.

sp_bindrule- связывания правила со столбцом таблицы.

sp_changedbdowner- передача прав владения БД другому лицу.

sp_changedobjectowner– передача прав владения объектом БД другому лицу.

sp_configure- отображение или настройка корректировокSQLServer2000.

sp_cursor_list- отображение имен курсоров, открытых в данный момент.

sp_depends- отображение списка таблиц, от которых создано данное представление.

sp_describe_cursor- получение информации о курсоре.

sp_describe_cursor_columns- выдача сведений о столбце курсора.

sp_detach_db- отсоединение БД.

sp_dropremotelogin- удаление отображения локального пользователя в учетную запись удаленного сервера.

sp_grantlogin– разрешение досутпа кSQL-serverпользователю или группе пользователей.

sp_help- получение справочной информации об объекте БД.

sp_helpfile- получение информации о конкретном файле БД.

sp_helpindex- выдача сведений об индексе таблицы.

sp_helptext- получениеSQLтекста хранимой процедуры, предствления или триггера.

sp_lock- выдача сведений об установленных процессом блокировках.

sp_password- добавление или изменение пароля для учетной записи.

sp_rename- изменение имени объекта в БД.

sp_renamedb– изменение имени БД.

sp_spaceused– получение данных об используемой памяти на диске.

sp_tableoption- установка некоторых опций для таблиц.

sp_unbindefault- снятие умолчания для столбца.

sp_unbindrule– удаление правила.

sp_who- получение информации о системном процессе.

Пример.

EXECsp_spaceused

Эта процедура выдаст информацию о памяти на диске под текущую БД.

EXEC sp_addlogin ‘sidorov’

EXEC sp_grantdbaccess ‘sidorov’,’stud01’

Первая из этих команд создаст учетную запись по имени ‘sidorov’, а вторая – свяжет ее с именем пользователемstud01.'формацию о памяти на диске под текущую БД.

00000000000000000000000000000000000000000000000000000000000000

формации о системном процессе.

записи.

ую запись удаленного сервера.

0000000000000000000000000000000000000000000000

3.2.6 Связь foxpro и sql server

Рассмотрим, как осуществить связь FOXPROиSQLServer. Реализуем следующий программный файл вFOXPRO.

CLOSE ALL

Open DataBase db1

CREATE CURSOR mycur(n c(30), a int,dp char(12))

h=SQLCONNECT("sqlsource2")

if h<=0

AERROR(a)

messagebox("No connection:"+str(a(1))

else

messagebox("Yess")

SQLSETPROP(h,"Asynchronous",.F.)

SQLPREPARE(h,"SELECT name,age,dep From dbo.persons","mycur")

SQLEXEC(h,"SELECT name,age,dep From dbo.persons","mycur")

locate for mycur.name="oleg"

if found()=.T.

messagebox("Name="+mycur.name+" Age="+str(mycur.age)+" Dep="+mycur.dep)

endif

SQLDISCONNECT(h)

endif

Видим, что этот программный файл использует сквозные SQL-запросы. Результат выборки поSELECTзаписывается в курсорmycur. Порядок объявления полей в курсоре должен совпадать с порядком их перечисления в запросеSELECT. При этом также должно быть обеспечено соответствие типов и имен полей. Для выполнения запроса организуем соединение

h=SQLCONNECT("sqlsource2")

Соединение с именем sqlsource2 должно быть заранее подготовлено и зарегистрировано. Для регистрации соединений сSQLServerследует использовать оснасткуBDEAdministrator. Порядок создания соединений сSQLServerопределяется мастером создания соединений – тип драйвераSQLServer. ФункцияAERRORвозвращает массив, заполненный информацией об ошибке. Первый элемент массива содержит номер ошибки.

Теперь рассмотрим, как организовать вызов хранимой процедуры. Воспользуемся следующей хранимой процедурой на SQLServer:

CREATE PROCEDURE [dbo].proc1

@fname char(16),

@nage int

AS

Begin

Update persons SET age=@nage WHERE name=@fname

END

RETURN0

GO

Видим, что эта процедура изменяет содержимое поля ageв таблицеpersons, устанавливая его равным значению переданного в процедуру параметра @nage. Приведенная процедура использует два входных параметра:

@fnamechar(16),

@nageint

Для вызова этой процедуры реализуем следующий программный prg-файл:

h=SQLCONNECT("sqlsource2")

if h<=0

AERROR(a)

messagebox("No connection:"+str(a(1))

else

messagebox("Yess")

SQLSETPROP(h,"Asynchronous",.F.)

z=40

s="oleg"

i=SQLEXEC(h,"EXEC proc1 ?s,?z")

messagebox("i="+ str(i)+ "Age="+str(z))

SQLDISCONNECT(h)

endif

Следует обратить внимание на вызов процедуры и передачу ей входных параметров:

i=SQLEXEC(h,"EXEC proc1 ?s,?z")

Имени входного параметра предшествует знак вопроса. Теперь рассмотрим, как получить значение из процедуры. Наша процедура объявлена следующим образом:

CREATEPROCEDURE[dbo].proc1

@schar(16)OUTPUT

AS

Begin

SELECT @s="oleg"

END

RETURN0

GO

Выходной параметр этой процедуры @sимеет символьный тип и атрибутOUTPUT. В теле процедуры переменная @sполучает значение строковой константы:

SELECT@s="oleg"

Текст вызывающего prg-файла таков:

h=SQLCONNECT("sqlsource2")

if h<=0

AERROR(a)

messagebox("No connection:"+str(a(1))

else

messagebox("Yess")

SQLSETPROP(h,"Asynchronous",.F.)

s1=""

i=SQLEXEC(h,"EXEC dbo.proc1 ?@s1")

messagebox("i="+ str(i)+ " return val="+s1)

SQLDISCONNECT(h)

endif

Обратим внимание на следующее. Выходной параметр передается в вызове как

?@s1. Имени параметра предшествуют знак вопроса и символ @. При успешном срабатывании хранимой процедуры переменнаяiполучает значение 1. При неудаче –1. Обращаем внимание на то, что имя параметра в тексте вызова не должно совпадать с именем в объявлении процедуры. Таким образом, не проходит:

s=""

i=SQLEXEC(h,"EXECdbo.proc1 ?@s")

messagebox("i="+ str(i)+ " return val="+s),

где переменная s1 заменена на переменнуюs, объявленную в процедуре. Наконец заметим, что в хранимых процедурахSQLServerобъявление выходной переменной с типомCURSORVARYINGOUTPUTне позволяет передать эту переменную в приложениеFOXPRO, а только в другуюSQL-процедуру или триггер.

В заключение приведем пример передачи рисунка на сторону SQLSereverиз приложенияFoxPro. Создадим следующую процедуру на сторонеSQLServer:

CREATEPROCEDUREspr

@tipchar(20),

@name char(40),

@fig image

AS

INSERT INTO tab values(@tip,@name,@fig)

RETURN

В этом тексте среди параметров, передаваемых в процедуру, объявлен рисунок:

@figimage

Текст программы FoxProдля вызова данной процедуры и передачи ей в качестве параметра рисунка таков:

CREATE CURSOR t1(im general)

SELECT t1

APPEND BLANK

APPEND GENERAL im FROM c:\work\1.bmp

*вызываем хранимую процедуру

err =SQLEXEC(conn,”EXEC spr ‘simple’,?im)

use

Разумеется, приведенный фрагмент не полный. Прежде всего, здесь нет команды для создания соединения conn:

conn=SQLCONNECT("sqlsource3")

Во-вторых, курсор можно создавать только при открытой базе данных. База данных открывается командой

OpenDataBaseимя_БД

Мы видим, наконец, что в качестве входного параметра в процедуру передается поле курсора im, содержащее рисунок.