Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PowerBuilder Новый топик    Ответить
 EXECUTE IMMEDIATE proc и in out переменные  [new]
JUNIORik
Member

Откуда:
Сообщений: 179
Есть процедура
proc(
id in number,
retrn out number
);

Конструкция
EXECUTE IMMEDIATE "proc(1);"
не подходит, т. к. выдается ошибка
wrong types or numbers.

Как обработать uot переменную.
8 май 08, 17:06    [5643464]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE proc и in out переменные  [new]
JUNIORik
Member

Откуда:
Сообщений: 179
Пишите наверно сюда.
8 май 08, 17:07    [5643471]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE proc и in out переменные  [new]
PL99
Member

Откуда: Moscow
Сообщений: 1367
JUNIORik
Есть процедура
proc(
id in number,
retrn out number
);

Конструкция
EXECUTE IMMEDIATE "proc(1);"
не подходит, т. к. выдается ошибка
wrong types or numbers.

Как обработать uot переменную.

Есть причина, по которой вы не используете RPC?
8 май 08, 17:23    [5643547]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE proc и in out переменные  [new]
JUNIORik
Member

Откуда:
Сообщений: 179
PL99
Есть причина, по которой вы не используете RPC?


Да, есть.
Если вы работали с Oracle , то
знаете, что есть такие коллекции.
И вот такую коллекцию я формирую на стороне клиента
и передаю параметром
в процедуру.
8 май 08, 17:33    [5643602]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE proc и in out переменные  [new]
PL99
Member

Откуда: Moscow
Сообщений: 1367
JUNIORik
PL99
Есть причина, по которой вы не используете RPC?


Да, есть.
Если вы работали с Oracle , то
знаете, что есть такие коллекции.
И вот такую коллекцию я формирую на стороне клиента
и передаю параметром
в процедуру.
Не вижу связи.
Приведите, хотя бы, спецификацию функции
12 май 08, 13:37    [5650533]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE proc и in out переменные  [new]
JUNIORik
Member

Откуда:
Сообщений: 179
оЙ, ЕНТЕР НАЖАЛА

В базе

create type tab_rec as table of varchar(15);

create or reaplace proc(in_tab   in  tab_rec, out_parm  out  integer)
...

На клиенте
(очевидно, что на клиенте
такого типа tab_rec нет)
используем execute immediate.

ls_sql = "DECLARE ";
ls_sql = ls_sql + "type tab_rec IS table of varchar(15); ";
ls_sql = ls_sql + "in_tab tab_rec; ";
ls_sql = ls_sql + "out_parm integer; ";
ls_sql = ls_sql + "BEGIN ";
ls_sql = ls_sql + "proc(in_tab, out_parm); ";
ls_sql = ls_sql + "END; ";
EXECUTE IMMEDIATE ls_sql;
Вопрос как обработать out_parm?
EXECUTE IMMEDIATE
12 май 08, 15:07    [5651172]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE proc и in out переменные  [new]
PL99
Member

Откуда: Moscow
Сообщений: 1367
JUNIORik
...
На клиенте
(очевидно, что на клиенте
такого типа tab_rec нет)
используем execute immediate.
...
хм... круто.

//объявление
subroutine myProcedure (string in_tab[], ref integer out_parm) RPCFUNC ALIAS FOR "myOwner.myProcedure"

//Вызов
integer li_Ret
string inArray[]
sqlca.myProcedure (inArray[], li_Ret)
if sqlca.sqlcode < 0 then
//обработка
else
messageBox ("li_Ret", string(li_ret))
end if
12 май 08, 17:00    [5651994]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE proc и in out переменные  [new]
spas2001
Member

Откуда: Тамбов--->Москва-->Тамбов-->Москва-->Тамбов
Сообщений: 2010
Что-то похожее обсуждалось
-----------------------------------------------------------------------------
Главная деталь любой машины - голова ее владельца
12 май 08, 17:02    [5652002]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE proc и in out переменные  [new]
JUNIORik
Member

Откуда:
Сообщений: 179
PL99
//объявление
subroutine myProcedure (string in_tab[], ref integer out_parm) RPCFUNC ALIAS FOR "myOwner.myProcedure"


На ORACLE так нельзя писать,
если я не права киньте в меня камень.
12 май 08, 18:32    [5652581]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE proc и in out переменные  [new]
JUNIORik
Member

Откуда:
Сообщений: 179
Ну, я в смысле что Oracle не воспримет массив (string in_tab[]).
12 май 08, 18:37    [5652607]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE proc и in out переменные  [new]
с новым годом
Guest
пробуй к своему ls_sql добавить

ls_sql += 'select out_parm;'

и запускать через курсор.
12 май 08, 18:58    [5652713]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE proc и in out переменные  [new]
PL99
Member

Откуда: Moscow
Сообщений: 1367
JUNIORik
PL99
//объявление
subroutine myProcedure (string in_tab[], ref integer out_parm) RPCFUNC ALIAS FOR "myOwner.myProcedure"


На ORACLE так нельзя писать,
если я не права киньте в меня камень.
Вы пробовали? Получили ошибку? Или просто Вам так кажется?

На всякий случай, все давно придумано
13 май 08, 13:12    [5655540]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE proc и in out переменные  [new]
gust-dust
Member

Откуда:
Сообщений: 18
PL99
JUNIORik
PL99
//объявление
subroutine myProcedure (string in_tab[], ref integer out_parm) RPCFUNC ALIAS FOR "myOwner.myProcedure"


На ORACLE так нельзя писать,
если я не права киньте в меня камень.
Вы пробовали? Получили ошибку? Или просто Вам так кажется?

На всякий случай, все давно придумано


И думать нечего - не работает. Так можно писать только если процедура ничего не возвращает. И в примерах по ссылке этой ситуации нет.

В хелпе есть топик про работу с процедурами которые имееют out аргументы. С такой процедурой надо работать как с курсором. Даешь declare, затем execute, затем fetch into, после close.
Чтобы все было чисто надо расставить аргументы процедуры так, чтобы все out были в конце. В declare их не пишешь, а в fetch будут только они.
13 май 08, 15:07    [5656389]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE proc и in out переменные  [new]
PL99
Member

Откуда: Moscow
Сообщений: 1367
gust-dust
И думать нечего - не работает.
Я не поленился написать пример
Oracle:
BANNER                                                          
----------------------------------------------------------------
Oracle Database 10g Release 10.2.0.1.0 - Production             
PL/SQL Release 10.2.0.1.0 - Production                          
CORE	10.2.0.1.0	Production                                      
TNS for 32-bit Windows: Version 10.2.0.1.0 - Production         
NLSRTL Version 10.2.0.1.0 - Production 
CREATE TABLE T$VA (F1 VARCHAR2(20));
CREATE OR REPLACE PACKAGE Testinout AS
TYPE ltVarcharArray IS TABLE OF VARCHAR2(100) INDEX BY BINARY_INTEGER;
PROCEDURE Test_Inout (aIN IN  ltVarcharArray, aiRet OUT NUMBER );
END Testinout;
/
CREATE OR REPLACE PACKAGE BODY Testinout AS
PROCEDURE TEST_INOUT (aIN IN ltVarcharArray, aiRet OUT NUMBER ) IS
BEGIN
    FORALL indx IN aIN.FIRST .. aIN.LAST
       INSERT INTO T$VA
          ( F1 )
          VALUES
          (aIN (indx));
aiRet := 1;
   EXCEPTION
     WHEN OTHERS THEN
aiRet := -1;
       RAISE;
END TEST_INOUT;
END testinout;
/

PB:
Version 7.0.3 build 10312
//Объявление
subroutine TEST_INOUT(string aIN[], ref double aiRet) RPCFUNC ALIAS FOR "EXDATA.TESTINOUT.TEST_INOUT"
//Не забудьте заменить EXDATA на вашего владельца пакета
//Вызов
string laIN[]
double li_Ret=0
string ls_Err

laIN [1] = '1'
laIN [2] = '2'
sqlca.TEST_INOUT ( laIN, li_Ret)
if sqlca.sqlcode = 0 then 
	commit;
	messagebox ("", string(li_ret))
else
	ls_Err = sqlca.SQLErrText
	rollback;
	messagebox ("", ls_Err)
end if
13 май 08, 20:17    [5658286]     Ответить | Цитировать Сообщить модератору
 Re: EXECUTE IMMEDIATE proc и in out переменные  [new]
JUNIORik
Member

Откуда:
Сообщений: 179
PL99
...

Круто
15 май 08, 16:12    [5669198]     Ответить | Цитировать Сообщить модератору
Все форумы / PowerBuilder Ответить