Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Запуск хранимой процедуры ORACLE через VBS + ADODB / 11 сообщений из 11, страница 1 из 1
15.08.2008, 18:19
    #35490528
XxxDaMnEdxxX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск хранимой процедуры ORACLE через VBS + ADODB
Помогите разобраться с проблемой.
Я что то туплю... заставили скрипт на VB написать, а я его сегодня первый день в глаза увидел.
Идея какова - есть БД Оракл там есть хранимая процедурка, которая отлично кстати выполняется в PL/SQL Developer'e

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE OR REPLACE PROCEDURE lock_ad_users(du IN VARCHAR2)
is
u VARCHAR2( 50 );
BEGIN
select u.username into u
  from bis.mss_users t, dba_users u
 where u.username = t.user_name
 and t.lan_resource = du;
 execute immediate 'ALTER USER '||u||' account lock';
END lock_ad_users;

Короче по имени доменной учетки лочит юзера в БД.
Нужно сделать так чтобы эта процедурка вызывалась из скрипта VB
вот что я пишу:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Set objConnection = CreateObject("ADODB.Connection")
Set objCommand =   CreateObject("ADODB.Command")
objConnection.Provider = "OraOLEDB.Oracle"
objConnection.Open "Data Source=(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.7)(PORT = 1521)))(CONNECT_DATA =(SERVER = DEDICATED)(SID = mydb)));User Id=scriptuser;Password=test;"
Set objCommand.ActiveConnection = objConnection
Set parameter = objCommand.CreateParameter("du",adVarChar,adParamInput, 50 ,"DomainUser")
with objCommand
.CommandType =  4 
.CommandText = "lock_ad_users"
.Parameters.Append parameter
.Execute
End With 
Wscript.Echo "Finish"

В итоге он у меня ругется что "Аргументы имеют неверный тип, выходят за пределы допустимого диапазона или вступают в конфликт друг с другом"

Разбираюсь, разбираюсь - понять не могу где тут собака зарыта?
...
Рейтинг: 0 / 0
15.08.2008, 19:34
    #35490622
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск хранимой процедуры ORACLE через VBS + ADODB
Во первых, для показа исходников надо использовать тэг SRC а не FIXED
Во вторых, сначала .CommandText=, потом .CreateParameter(). Когда ты задаешь новую sql команду, все параметры созданные на основе предыдущей sql команды "ломаются".
В третьих, а тебе обязательно делать параметрический запрос? Вот так не проще будет?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Set objConnection = CreateObject("ADODB.Connection")
Set objCommand =   CreateObject("ADODB.Command")
objConnection.Provider = "OraOLEDB.Oracle"
objConnection.Open "..... тут строка коннекта ..... "
with objCommand
    Set .ActiveConnection = objConnection
    .CommandType =  1  ' или -1, или вообще не задавать
    .CommandText = "lock_ad_users('DomainUser')"
    .Execute
End With 
Wscript.Echo "Finish"
...
Рейтинг: 0 / 0
15.08.2008, 22:08
    #35490725
XxxDaMnEdxxX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск хранимой процедуры ORACLE через VBS + ADODB
Неа так получается не проще. пишет Invalid SQL statement. Как будто в PL/SQL пишешь в SQL window, а не в SQL Command.
...
Рейтинг: 0 / 0
15.08.2008, 22:22
    #35490732
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск хранимой процедуры ORACLE через VBS + ADODB
XxxDaMnEdxxXНеа так получается не проще. пишет Invalid SQL statement. Как будто в PL/SQL пишешь в SQL window, а не в SQL Command.А какой командой ты можешь запустить свою процедуру из "PL/SQL SQL window" или как там твоя ораклевая консоль называется?
Зайди в свою базу через ее родную SQL утилиту. Сделай то что тебе надо вручную. А потом скопируй эту команду как есть в свой VBS.
...
Рейтинг: 0 / 0
18.08.2008, 14:53
    #35492757
XxxDaMnEdxxX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск хранимой процедуры ORACLE через VBS + ADODB
Вот так это вызывается в PL/SQL SQL window
Код: plaintext
1.
2.
begin
  lock_ad_users(du => 'DOMAIN USER');
end;

а в SQL Command
Код: plaintext
exec lock_ad_users('DOMAIN USER');
...
Рейтинг: 0 / 0
18.08.2008, 15:24
    #35492851
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск хранимой процедуры ORACLE через VBS + ADODB
описатель ф-ии в оракле сюда выложи, у тебя параметр в вызове похоже неверно описан.
...
Рейтинг: 0 / 0
18.08.2008, 15:30
    #35492880
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск хранимой процедуры ORACLE через VBS + ADODB
а именно, не указан размер параметра в описании ф-и.

Код: plaintext
CREATE OR REPLACE PROCEDURE lock_ad_users(du IN VARCHAR2( 50 ))

в вызов еще надо добавить первый параметр RET:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Dim p As ADODB.Parameters

    ...
    Set p = cmd.Parameters
    p.Append cmd.CreateParameter("RET", adInteger, adParamReturnValue)
    p.Append cmd.CreateParameter("du",adVarChar,adParamInput, 50 ,"DomainUser")
    cmd.Execute
    ...
...
Рейтинг: 0 / 0
18.08.2008, 16:51
    #35493098
XxxDaMnEdxxX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск хранимой процедуры ORACLE через VBS + ADODB
Konst_One, если указать размер переменной - то процедура вообще не создастся. И добавление строки
Код: plaintext
1.
p.Append cmd.CreateParameter("RET", adInteger, adParamReturnValue)
тоже ничего не дает. Ошибка та же.
...
Рейтинг: 0 / 0
18.08.2008, 16:57
    #35493118
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск хранимой процедуры ORACLE через VBS + ADODB
потому что аналогично декларировать еще нужно и в описании схемы
...
Рейтинг: 0 / 0
18.08.2008, 17:26
    #35493212
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск хранимой процедуры ORACLE через VBS + ADODB
XxxDaMnEdxxXВот так это вызывается в PL/SQL SQL window
Код: plaintext
1.
2.
begin
  lock_ad_users(du => 'DOMAIN USER');
end;

а в SQL Command
Код: plaintext
exec lock_ad_users('DOMAIN USER');


Тогда может сработать вот такое:
Код: plaintext
1.
2.
objCommand.CommandText = "begin" & vbCRLF & _
"  lock_ad_users(du => 'DOMAIN USER');"  & vbCRLF & _
"end;"
И уж точно сработает такое:
Код: plaintext
objCommand.CommandText = "exec lock_ad_users('DOMAIN USER');"
ADO ни как не обрабатывает CommandText если .CommandType равен 1 или -1. В этом случае ADO напрямую отдает команду ODBC драйверу который (обычно) без обработки отдает команду серверу. То есть открываешь документацию на свою СУБД и используешь ее родной синтаксис.
Единственная возможная обработка это параметры запроса. Но параметры в реальности редко когда нужны. Обычно намного эффективнее вклеивать параметры в строку запроса как константы.
В твоем случае параметры не нужны точно. Можно и с ними конечно, но в данном случае это излишнее усложнение кода без какого-либо выигрыша в производительности.
...
Рейтинг: 0 / 0
21.08.2008, 12:57
    #35498952
XxxDaMnEdxxX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск хранимой процедуры ORACLE через VBS + ADODB
Спасибо,
Код: plaintext
1.
2.
3.
objCommand.CommandText = "begin" & vbCRLF & _
"  lock_ad_users(du => 'DOMAIN USER');"  & vbCRLF & _
"end;"
помогло!
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Запуск хранимой процедуры ORACLE через VBS + ADODB / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]