Перейти к содержимому

Фотография

LoadRunner и переменные ora pl/sql


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 3

#1 Entroll

Entroll

    Новый участник

  • Members
  • Pip
  • 2 сообщений
  • ФИО:123


Отправлено 24 июня 2011 - 08:27

Добрый день.

Вопрос про сохранение значения, возвращаемого процедурой, для последующего использования.
Сразу скажу, что мало знаком и с pl/sql и с лоадраннером, не судите строго.

Есть процедура вида TEST(RC=>RC_2,ID=>ID_3, ...) с большим кол-вом out параметров.
Интересует только ID - хочется запомнить и потом обращаться к нему в других блоках через переменную вида <stored_id>.

По доке через placeholder (раздел Example: lrd_save_value ), получилось так:

Блок
DECLARE
  RC_2 SYS_REFCURSOR;
  ID_3 NUMBER := 0;
  <остальные>
BEGIN 
  :result = TEST(RC=>RC_2,ID=>ID_3, <остальные>);
END;

Скрипт LR:
lrd_ora8_stmt(OraStm576,<наш блок>,...);

lrd_ora8_bind_placeholder(OraStm576, "result", &result_D2, 0, 0, 0);

lr_start_transaction(...);
lrd_ora8_exec(OraSvc1, OraStm576, ...);

lrd_save_value (&result_D2, 0, 0, "stored_id"); 

lr_end_transaction(...);

При компиляции получаю ошибку вида:
Action.c:9498:73: macro `lrd_ora8_bind_placeholder' used with only 6 args

Конкретно число (6 или 60) не важно, не понимаю суть ошибки - хотим же забиндить только вторую ячейку с нужным ID.

Подскажите, в чем проблема? Или может есть стандартное решение для такого случая?

Заранее спасибо.
  • 0

#2 Куатор

Куатор

    Постоянный участник

  • Members
  • PipPipPip
  • 247 сообщений
  • ФИО:Комендантов Илья
  • Город:Украина, Одесса

Отправлено 24 июня 2011 - 08:53

При компиляции получаю ошибку вида:
Action.c:9498:73: macro `lrd_ora8_bind_placeholder' used with only 6 args

Конкретно число (6 или 60) не важно, не понимаю суть ошибки - хотим же забиндить только вторую ячейку с нужным ID.

Подскажите, в чем проблема? Или может есть стандартное решение для такого случая?

Заранее спасибо.

Привет!
В ошибке речь идёт о том, что macro ' lrd_ora8_bind_placeholder ' вызывается с 6-ю аргументами, если судить по help , то аргументов должно быть 7-мь.
LRDRET lrd_ora8_bind_placeholder(void *mpvLRDDBIHandleStmt, void **mppvLRDDBIHandleBind, char *mpszPlaceholder, LRD_VAR_DESC *mptVarDesc, unsigned long muliOption, long mliMode, int miDBErrorSeverity );

  • 0
Идеальный тестировщик - человек с золотыми руками, растущими из ж...

#3 Entroll

Entroll

    Новый участник

  • Members
  • Pip
  • 2 сообщений
  • ФИО:123


Отправлено 27 июня 2011 - 06:15

Привет!
В ошибке речь идёт о том, что macro ' lrd_ora8_bind_placeholder ' вызывается с 6-ю аргументами, если судить по help , то аргументов должно быть 7-мь.

LRDRET lrd_ora8_bind_placeholder(void *mpvLRDDBIHandleStmt, void **mppvLRDDBIHandleBind, char *mpszPlaceholder, LRD_VAR_DESC *mptVarDesc, unsigned long muliOption, long mliMode, int miDBErrorSeverity );


Да, странно, что в хэлпе их было вообще 5

Попытался сделать бинд на основе примера перехвата из sqlplus выполнения команд
variable id NUMBER;
print id;

К сожалению, LR не перехватывает объявление глобальной переменной в сессии, так бы проблема решилась сразу.

Получил скрипт
 lrd_ora8_handle_alloc(OraEnv1, STMT, &OraStm7, 0);
 lrd_ora8_stmt(OraStm7, "SELECT :id id FROM DUAL", 1, 32, 0);

 lrd_assign(&P1D10, 0, 0, 0, 0);
 lrd_ora8_bind_placeholder(OraStm7, &OraBnd2, "1", &P1D10, LRD_BIND_BY_POS, 0, 0);

 lr_start_transaction("MercuryExec_6");

 lrd_ora8_exec(OraSvc1, OraStm7, 0, 0, &uliRowsProcessed, 0, 0, 0, 0, 0);
GRID0(8);
 lr_end_transaction("MercuryExec_6", LR_AUTO);

 lrd_ora8_bind_col(OraStm7, &OraDef9, 1, &id_D11, 0, 0);
 
 lrd_ora8_fetch(OraStm7, -1, 15, &uliFetchedRows, PrintRow10, 2, 0, 0);
GRID8(10);
 lrd_handle_free(&OraStm7, 0);

Переменные P1D10, id_D11, OraBnd2 и OraDef9 LR определяет сам. Я их нашел только в vdf.h, может быть еще где-то есть?


Вобщем, добавил в свой блок селект просле выполнения процедуры - чтобы биндить результат как в примере с print:
TEST(...);
select ID_3 into temp_id from dual;

Но автоматически LR ничего аналогичного примеру с print не добавил, осталось как и было
 lrd_ora8_stmt(...);
 lr_start_transaction(...);

 lrd_ora8_exec(...);
 lr_end_transaction(...);
 lrd_handle_free(...);

Добавил руками команды по шаблону print, только без grid (не понял как его туда вставить).
При выполнении контроллер выдает:

"Error: lrdo_ora8_bind_placeholder: "OCIBindByPos" return-code=OCI_ERROR, error-code=01036:"

ORA-01036: illegal variable name/number.

На этом идеи кончились.

Подскажите, как правильно сделать то?
  • 0

#4 Куатор

Куатор

    Постоянный участник

  • Members
  • PipPipPip
  • 247 сообщений
  • ФИО:Комендантов Илья
  • Город:Украина, Одесса

Отправлено 27 июня 2011 - 07:14

:) Не скажу, что я сильно спец в оракл-протоколе ЛР.. но грид это вроде бы таблица с данными, создаётся при записи скрипта.
Как её сделать вручную не скажу, не знаю.. выглядит так:Прикрепленный файл  ora.png   8,26К   7 Количество загрузок:
может ты пытаешься обратиться к гриду (таблице с данными), и извлечь данные из таблицы ,которой нет?
  • 0
Идеальный тестировщик - человек с золотыми руками, растущими из ж...


Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных