Ошибка при вызове хранимой процедуры

Привет всем! Короче есть созданная процедура ppp, которая создает таблицу! При вызове процедуры со входным данным varchar2. Выводит ошибки: ORA-00904, ORA-06512! Где ошибка? Прошу помочь!!!

введите сюда описание изображения

Код создания процедуры:

CREATE OR REPLACE PROCEDURE ppp(poz in varchar2) is
BEGIN
  EXECUTE IMMEDIATE 
  'create table tmp#ppp_'||poz||' as
  select * 
  from  tmp#players_1 
  where pl_pos = ' || poz ;
END ppp;

Код вызова процедуры:

call ppp('MF');

Viktorov's user avatar

Viktorov

7,1658 золотых знаков37 серебряных знаков65 бронзовых знаков

задан 14 дек 2016 в 5:31

assyl.d's user avatar

Вы потеряли кавычки вокруг MF. и в результате Оракл пытался выполнить такой запрос:

create table tmp#ppp_MF as
   select * 
   from tmp#players_1 
   where pl_pos = MF

Очевидно, что колонки MF у Вас нет. Перепишите процедуру вот так:

CREATE OR REPLACE PROCEDURE ppp(poz in varchar2) is
BEGIN
   EXECUTE IMMEDIATE 
   'create table tmp#ppp_'||poz||' as
   select * 
   from tmp#players_1 
   where pl_pos = ''' || poz||'''' ;
END ppp;

ответ дан 14 дек 2016 в 6:49

Viktorov's user avatar

ViktorovViktorov

7,1658 золотых знаков37 серебряных знаков65 бронзовых знаков

1

SQL Server 2014 Developer SQL Server 2014 Enterprise SQL Server 2014 Standard Еще…Меньше

Проблемы

Предположим, что вы создали связанный сервер для экземпляра Microsoft SQL Server 2014 с пакетом обновления 1 (SP1). При выполнении хранимой процедуры, которая вызывает другую хранимую процедуру на связанном сервере, и передается большой объект в качестве входного параметра, запрос завершается сбоем. Кроме того, появляется приведенное ниже сообщение об ошибке:

Ошибка: 17065, серьезность: 16, состояние: 1. SQL Server assertion: file: < tmpilb. cpp>, line = 3280 не прошел утверждение = ‘ FFalse ‘ Release. Эта ошибка может быть связана со временем. Если ошибка не исчезнет после повторного выполнения инструкции, используйте DBCC CHECKDB, чтобы проверить базу данных на наличие структурной целостности, или перезапустите сервер, чтобы убедиться в том, что структуры данных в памяти не повреждены.

Решение

Сведения об исправлении

Это исправление включено в накопительный пакет обновления 2014 (SP1) для SQL Server.

  • Накопительное обновление 6 для SQL Server 2014 с пакетом обновления 1 (SP1)

Все новые накопительные обновления для SQL Server содержат все исправления и все исправления для системы безопасности, которые были включены в предыдущий накопительный пакет обновления. Ознакомьтесь с самыми последними накопительными обновлениями для SQL Server.

Последнее накопительное обновление для SQL Server 2014

Исправления, включенные в этот пакет

Номер ошибки в VSTS

Номер статьи в базе знаний

Описание

5699529

3097972

ИСПРАВИТЬ: ошибка при вызове хранимой процедурой другой хранимой процедуры на связанном сервере SQL Server 2014

5951292

3106976

Исправление: нарушение прав доступа происходит при использовании функций TDE и BPE в SQL Server 2014

5952334

3074434

Исправление: ошибка «недостаточно памяти», если для виртуального адресного пространства процесса SQL Server недостаточно доступной памяти

Предварительные условияЧтобы установить это исправление, необходимо установить SQL Server 2014 с пакетом обновления 1 (SP1).

Сведения о внесении изменений в реестрЧтобы использовать исправление из этого пакета, вам не нужно вносить изменения в реестр.

Требование перезагрузкиПосле установки этого исправления может потребоваться перезагрузить компьютер.

Сведения о замене исправленийЭто исправление не заменяет ранее выпущенное исправление.

Статус

Корпорация Майкрософт подтверждает наличие этой проблемы в своих продуктах, которые перечислены в разделе «Применяется к».

Нужна дополнительная помощь?

Привет всем! Короче есть созданная процедура ppp, которая создает таблицу! При вызове процедуры со входным данным varchar2. Выводит ошибки: ORA-00904, ORA-06512! Где ошибка? Прошу помочь!!!

введите сюда описание изображения

Код создания процедуры:

CREATE OR REPLACE PROCEDURE ppp(poz in varchar2) is
BEGIN
  EXECUTE IMMEDIATE 
  'create table tmp#ppp_'||poz||' as
  select * 
  from  tmp#players_1 
  where pl_pos = ' || poz ;
END ppp;

Код вызова процедуры:

call ppp('MF');

Viktorov's user avatar

Viktorov

7,0758 золотых знаков34 серебряных знака65 бронзовых знаков

задан 14 дек 2016 в 5:31

assyl.d's user avatar

Вы потеряли кавычки вокруг MF. и в результате Оракл пытался выполнить такой запрос:

create table tmp#ppp_MF as
   select * 
   from tmp#players_1 
   where pl_pos = MF

Очевидно, что колонки MF у Вас нет. Перепишите процедуру вот так:

CREATE OR REPLACE PROCEDURE ppp(poz in varchar2) is
BEGIN
   EXECUTE IMMEDIATE 
   'create table tmp#ppp_'||poz||' as
   select * 
   from tmp#players_1 
   where pl_pos = ''' || poz||'''' ;
END ppp;

ответ дан 14 дек 2016 в 6:49

Viktorov's user avatar

ViktorovViktorov

7,0758 золотых знаков34 серебряных знака65 бронзовых знаков

1

if i run this model program without stored procedure calling means working fine.But if i calling stored procedure means throwing error.please help me i think the way of representing table name is wrong while calling stored procedure.

MODEL

 <?php if (!defined('BASEPATH')) exit('No direct script access allowed');

     class Members_model extends CI_Model 
     {       
         function select_members() 
         {           
             $query = $this->db->get('users'); //Table Name
             $query = $this->db->query("CALL get_members()");// calling stored procedure
             return $query->result_array();         
         }      
     }
?>

NOTE: Thrown Error
A Database Error Occurred

Error Number: 2014

Commands out of sync; you can't run this command now

UPDATE `users` SET `username` = 'ThottiJaya', `password` = '28bf' WHERE `id` = 127

Filename: C:xampphtdocssystemdatabaseDB_driver.php

Line Number: 330

zajonc's user avatar

zajonc

1,9275 gold badges19 silver badges25 bronze badges

asked Dec 2, 2013 at 12:17

user3034972's user avatar

2

As per MySQL:

C.5.2.14. Commands out of sync
If you get Commands out of sync; you can’t run this command now in your client code, you are > calling client functions in the wrong order.

This can happen, for example, if you are using mysql_use_result() and try to execute a new query before you have called mysql_free_result(). It can also happen if you try to execute two queries that return data without calling mysql_use_result() or mysql_store_result() in between.

I am assuming that, before making a call to update, you have some result set opened up and not used yet. And hence is the error. If you have nothing to do with the result, then you should be calling mysql_free_result() and then go for update call.

Refer To: MySQL: Commands out of sync

Refer To similar posts:
SO: Why I am getting the Error “Commands out of sync; you can’t run this command now”


There is also a case where you need to change your mysql driver to mysqli.

Refer to similar post:
SO: MySQL Error — Commands out of sync; you can’t run this command now

Hope this helps.

Community's user avatar

answered Dec 3, 2013 at 8:45

Ravinder Reddy's user avatar

Ravinder ReddyRavinder Reddy

23.4k6 gold badges51 silver badges81 bronze badges

Try to change database driver in your config from:

$db[‘default’][‘dbdriver’] = ‘mysql’;

to

$db[‘default’][‘dbdriver’] = ‘mysqli’;

answered Dec 2, 2013 at 14:17

Dmitry Seleznev's user avatar

if i run this model program without stored procedure calling means working fine.But if i calling stored procedure means throwing error.please help me i think the way of representing table name is wrong while calling stored procedure.

MODEL

 <?php if (!defined('BASEPATH')) exit('No direct script access allowed');

     class Members_model extends CI_Model 
     {       
         function select_members() 
         {           
             $query = $this->db->get('users'); //Table Name
             $query = $this->db->query("CALL get_members()");// calling stored procedure
             return $query->result_array();         
         }      
     }
?>

NOTE: Thrown Error
A Database Error Occurred

Error Number: 2014

Commands out of sync; you can't run this command now

UPDATE `users` SET `username` = 'ThottiJaya', `password` = '28bf' WHERE `id` = 127

Filename: C:xampphtdocssystemdatabaseDB_driver.php

Line Number: 330

zajonc's user avatar

zajonc

1,9275 gold badges19 silver badges25 bronze badges

asked Dec 2, 2013 at 12:17

user3034972's user avatar

2

As per MySQL:

C.5.2.14. Commands out of sync
If you get Commands out of sync; you can’t run this command now in your client code, you are > calling client functions in the wrong order.

This can happen, for example, if you are using mysql_use_result() and try to execute a new query before you have called mysql_free_result(). It can also happen if you try to execute two queries that return data without calling mysql_use_result() or mysql_store_result() in between.

I am assuming that, before making a call to update, you have some result set opened up and not used yet. And hence is the error. If you have nothing to do with the result, then you should be calling mysql_free_result() and then go for update call.

Refer To: MySQL: Commands out of sync

Refer To similar posts:
SO: Why I am getting the Error “Commands out of sync; you can’t run this command now”


There is also a case where you need to change your mysql driver to mysqli.

Refer to similar post:
SO: MySQL Error — Commands out of sync; you can’t run this command now

Hope this helps.

Community's user avatar

answered Dec 3, 2013 at 8:45

Ravinder Reddy's user avatar

Ravinder ReddyRavinder Reddy

23.4k6 gold badges51 silver badges81 bronze badges

Try to change database driver in your config from:

$db[‘default’][‘dbdriver’] = ‘mysql’;

to

$db[‘default’][‘dbdriver’] = ‘mysqli’;

answered Dec 2, 2013 at 14:17

Dmitry Seleznev's user avatar

  

Sponger

11.11.15 — 13:34

Все привет.

Есть проблема.

Вызываю хранимую процедуру Oracle, но выдает ошибку. Ругается на параметры, но не могу догнать в чем беда. Помогите плиз.

Это хранимка

p_lastdate — передаваемый параметр, дата

p_rates — курсор

pkg_1c_api.get_rate(p_lastdate => :p_lastdate, p_rates => :p_rates);

не понимаю что надо передать в p_rates

Попытка

Connection = Новый COMОбъект(«ADODB.Connection»);

Connection.Provider = «OraOLEDB.Oracle.1»;

Connection.ConnectionString = «моя строка подключения»;

Connection.Open();

        
adCmdStoredProc = 4;

    
adParamInput = 1;

        
adDate = 7;

        

Cmd = Новый COMОбъект(«ADODB.Command»);

Cmd.ActiveConnection = Connection;

Cmd.CommandText = «pkg_1c_api.get_rate»;

Cmd.CommandType = adCmdStoredProc;

    

Param1 = Cmd.CreateParameter(«@p_lastdate», adDate, adParamInput, 4, Дата(2015,10,1));

Cmd.Parameters.Append(Param1);

        

//Param2 = Cmd.CreateParameter(«p_rates», adNumeric, adParamOutput, 4, NULL);

//Cmd.Parameters.Append(Param2);

        

Попытка

RecordSet = Новый COMОбъект(«ADODB.RecordSet»);

RecordSet = cmd.Execute(); // вот в этой строке ошибка

Пока (RecordSet.State=0) цикл

RecordSet=RecordSet.NextRecordset();

КонецЦикла;

Исключение

Предупреждение(ОписаниеОшибки());

Отказ = Истина;

КонецПопытки;        

Исключение

Предупреждение(«Не удалось создать подключение!»);

КонецПопытки;

  

Sponger

1 — 11.11.15 — 13:39

Ошибка

ORA-06550: строка1, столбец7: PLS-00306: ошибочно число или типы аргументов при обращении к GET_RATE

ORA-06550: строка1, столбец7

PL/SQL: Statement ignored

  

mistеr

2 — 11.11.15 — 13:45

(0) > не понимаю что надо передать в p_rates

Сказано же — курсор. В 1С такого зверя нет. Получить его можно в PL/SQL или, если хитро извернуться, в программе на C++.

Если переформулировать для блондинок, эта хранимка не предназначена для вызова из 1С.

  

Sponger

3 — 11.11.15 — 13:54

т.е. хранимку надо переписать чтобы она возвращала курсор не в параметр?

  

Sponger

4 — 11.11.15 — 13:58

ПЕРЕФРАЗИРУЮ

надо переписать чтобы возвращала не курсор, а таблицу (набор записей, RECORDSET)

c Oracle впервые пытаюсь вытащить что-то

  

mistеr

5 — 11.11.15 — 13:59

(3) Да, сделать обертку-функцию.

  

Sponger

6 — 11.11.15 — 14:19

(5) она должна делаться в Oracle?

  

Sponger

7 — 11.11.15 — 14:22

а вот такой вариант делал ктонить?

— Установить (ИМХО лучше на сервере mssql) клиента Oracle

— Настроить ODBC к Oracle

— в mssql настроить Linked Servers к ораклу

— написать хранимку в mssql, которая будет принимать ваши параметры и транслировать в хранимку на оракле, возвращая вам результат. ИЛИ делать выборку из представления…

— в оракле написать хранимку по сбору нужных данных или представление, из которого сиквеловский скрипт будет селектить данные (в зависимости от условий — возможно это даже предпочтительней)

В Oracle для меня никто не будет ничего переписывать.

Потому надо найти выход.

  

МихаилМ

8 — 11.11.15 — 14:37

сделайте обертку — psql скрипт.

и вызывайте не хранимую процедуру , а комманду — скрипт , который будет вызвать хранимую процедуру.

  

Sponger

9 — 11.11.15 — 14:44

(8) я и спрашиваю. Обертку в Oracle делать?

  

Sponger

10 — 11.11.15 — 14:45

(8) примеры не скинете ссылку?

  

mistеr

11 — 11.11.15 — 14:48

(6) Можно попробовать в анонимном блоке.

(7) Код хранимки есть?

  

Sponger

12 — 11.11.15 — 15:01

(11) Завтра попробую код хранимки взять

  

Sponger

13 — 12.11.15 — 06:58

(11) с кодом засада. Не будет кода.

Только вызов и входящие параметры. я уже написал их.

  

Sponger

14 — 12.11.15 — 06:59

(8) примеры не скинете или ссылку на описание как делать?

  

Repey

15 — 12.11.15 — 07:28

Это у тебя все же процедура или функция?

Дай пример вызова прямо из оракла.

  

Sponger

16 — 12.11.15 — 10:46

(15) процедура.

Ораклоиды код не дают. Первый раз Оракл вижу, и надо получить данные.

Вот все что есть.

pkg_1c_api.get_rate(p_lastdate => :p_lastdate, p_rates => :p_rates);

p_lastdate — передаваемый параметр, дата

p_rates — курсор

  

mistеr

17 — 12.11.15 — 11:45

(16) Единственное, что могу сказать. Если бизнесу нужны эти данные в 1С, все административные препятствия преодолеваются на раз. Выходи на заинтересованных лиц и решай вопрос. Иногда кодер должен на минутку становиться манагером.

  

Repey

18 — 12.11.15 — 12:34

(16) То есть это процедура, и она тебе возвращает курсор «p_rates»?

  

Sponger

19 — 12.11.15 — 13:06

(18) да.

  

Repey

20 — 12.11.15 — 13:19

(19) Сколько полей на выходе должно получиться?

Ориентировочное количество записей?

  

Sponger

21 — 12.11.15 — 13:26

В курсоре сейчас

       CURR_ID    RATE    FROMDATE    CURRENCYCODE    TEXT    ISOCODE

1    1    273,53    08.10.2015 23:59:59    USD    Американский доллар    840

  

Sponger

22 — 12.11.15 — 13:28

блин, нет форматирования.

Получается 6 полей.

  

Repey

23 — 12.11.15 — 14:06

А записей сколько?

Если немного — можно собрать результат в строку с разделителями, а на стороне 1С уже разобрать ее.

Иначе вижу только вариант с временной таблицей.

В любом случае, считаю, это будет лучше, чем доп. звено добавлять.

Развивать тему?

  

Sponger

24 — 12.11.15 — 14:23

(23) может в личку?

пока в курсоре у меня 1 запись.

Но мне надо понять механизм.

В дальнейшем будет много.

Я бы не отказался от обоих вариантов и с разделителями и с временной таблицей.

  

Sponger

25 — 12.11.15 — 14:29

вот код хранимки

select * from table(pkg_1c_api.get_rate(p_lastdate => to_date(‘01.10.2015′,’dd.mm.yyyy’)))

  

mistеr

26 — 12.11.15 — 15:47

(25) Вот и делай такой же select, через Statement.

  

Sponger

27 — 13.11.15 — 05:57

(26) что есть Statement?

Как мне его из 1С организовать?

  

Мэс33

28 — 13.11.15 — 06:19

  

Мэс33

29 — 13.11.15 — 06:24

  

mistеr

30 — 13.11.15 — 10:22

(27) Не, Statement это я напутал. Тот же Command, только с другим CommandType.

  

Sponger

31 — 13.11.15 — 10:25

(28) спрасибо.

        
НаборЗаписей = Connection.Execute(«select * from table(pkg_1c_api.get_rate(‘»+ Формат(ТекДата, ФорматДаты) + «‘))»);

        

Для каждого СтрокаИтем Из НаборЗаписей.Fields Цикл

    Если ТЗ.Колонки.Количество() <> НаборЗаписей.Fields.Count Тогда

        НоваяСтрока[СтрокаИтем.Name] = СтрокаИтем.Value;

    КонецЕсли;

КонецЦикла;        

вот так заработало. Правда у меня в курсоре 1 строка. Щас проверю с набором строк.

  

Sponger

32 — 13.11.15 — 10:43

да. Таким методом я получаю набор строк, но работаю только с первой строкой набора.

Как получить все строки?

  

Sponger

33 — 13.11.15 — 10:46

Протупил.

НаборЗаписей.moveNext()

работает.

Модератор: Модераторы

Ошибка при вызове хранимой процедуры MySQL

Создал в MySQL хранимую процедуру:

Код: Выделить всё
CREATE PROCEDURE fifo (in id_inp BIGINT, OUT Ret_code int)
....

Процедура успешно отрабатывает если запускать ее из консоли или phpmyadmin.
При попытке вызвать ее из программы на Lazarus получаю сообщение об ошибке.
Procedure fifo can`t return a result set in the given context.
Код:

Код: Выделить всё
SQLQuery1.Active:=false; SQLQuery1.SQL.Clear;
   SQLQuery1.SQL.Add('CALL fifo('+inttostr(id_document)+',@result)');
   SQLQuery1.ExecSQL;

Пробовал SQLQuery1.open — пишет, что открывать можно только select запросы.
По результатам гугления добавил в mysql50connection.params

Код: Выделить всё
CLIENT_MULTI_STATEMENTS=true
CLIENT_MULTI_RESULTS=true

Не помогло. не дает запускать вообще никакие хранимые процедуры. Запросы на выборку и обновление работают.
Никто не встречал подобного? Как лечить?
Спасибо.

Использую:
libmysql.so.14
fpc 2.6.0
Lazarus SVN 2013-03-05 GTK2

volodya25
новенький
 
Сообщения: 10
Зарегистрирован: 03.11.2011 22:33:23
Откуда: Украина

Re: Ошибка при вызове хранимой процедуры MySQL

Сообщение Ism » 16.10.2013 17:49:18

Вы хотите получить результат давая запрос на исполнение, процедуре некуда возвращать результат
Возможно нужно сделать функцию и сделать так

Код: Выделить всё
SQLQuery1.SQL.Add('select fifo('+inttostr(id_document)+') as Field)
SQLQuery1.Open
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Re: Ошибка при вызове хранимой процедуры MySQL

Сообщение EmeraldMan » 16.10.2013 18:00:49

До недавнего времени, действительно SQLQuery1.Open на запрос CALL, возвращяемой значения процедуры, выдавал ошибку.
Точно не помню с какой версии все заработало. В Lazarus 1.0.8 и FPC 2.6.2 — данной проблемы уже нет. В более поздних так же должно работать.

Ism, во многих случаях возможностей функции просто не хватает. Бывает надо в конце выполнения вывести многострочный результат в виде таблицы. По моему, в функции так же запрещены транзакции, в процедурах их можно использовать.

Аватара пользователя
EmeraldMan
постоялец
 
Сообщения: 149
Зарегистрирован: 16.10.2008 08:41:51
Откуда: Белгород
  • Профиль
  • Сайт
  • ICQ

Re: Ошибка при вызове хранимой процедуры MySQL

Сообщение volodya25 » 16.10.2013 22:46:25

Переделать процедуру на функцию не получилось — иногда возможен многострочный результат.
Получаю ошибку «Not allowed to return a result set from a function»
Попробую обновить Lazarus и FPC.

volodya25
новенький
 
Сообщения: 10
Зарегистрирован: 03.11.2011 22:33:23
Откуда: Украина

Re: Ошибка при вызове хранимой процедуры MySQL

Сообщение Ism » 17.10.2013 15:01:30

volodya25 писал(а):Переделать процедуру на функцию не получилось — иногда возможен многострочный результат.
Получаю ошибку «Not allowed to return a result set from a function»
Попробую обновить Lazarus и FPC.

Возвращайте в виде строки с разделителями. Вообще в mysql есть временные таблицы
В zeosdbo получение из функции работает

Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Re: Ошибка при вызове хранимой процедуры MySQL

Сообщение volodya25 » 18.10.2013 11:58:03

Установил ZeosDBO и все заработало.
Всем спасибо. Вопрос закрыт.

volodya25
новенький
 
Сообщения: 10
Зарегистрирован: 03.11.2011 22:33:23
Откуда: Украина


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 10

Вы создаете SqlCommand объект, затем установите его CommandType свойство, затем перезапишите его, вызвав new снова на вашем командном объекте. При правильном написании ваш код должен выглядеть так:

public string GetData (string destinationFile)
{
   string conectionString = "uid=One_User;pwd=One_Password;database=One_Database;server=One_Server";
   SqlConnection con = new SqlConnection(connectionString);
   SqlCommand sqlCmd = new SqlCommand(procedureName, con); 
   sqlCmd.CommandType = CommandType.StoredProcedure;  
   string returnValue = string.Empty;
   string procedureName = "spGet_Data";

   sqlCmd.Parameters.AddWithValue("@FileName", destinationFile);
   con.Open();
   var returnParameter = sqlCmd.Parameters.Add("@ret", SqlDbType.VarChar);
   returnParameter.Direction = ParameterDirection.ReturnValue;

   sqlCmd.ExecuteNonQuery();
   returnValue = returnParameter.Value.ToString();

   con.Close();
   return returnValue;
}

Кроме того, я настоятельно рекомендую вам окружить SqlConnection и SqlCommand объекты с Использование утверждения. Примерно так:

public string GetData (string destinationFile)
{
   using (SqlConnection con = new SqlConnection(connectionString))
   {
      using (SqlCommand sqlCmd = new SqlCommand(procedureName, con))
      {
      }
   } 
}    

Преимущество этого способа заключается в более чистом коде, а поскольку ваши объекты команд и соединений реализуют IDisposable, они будут обработаны сборщиком мусора, как только они выйдут из области видимости.

Кстати, у вас неправильно написано «connectionString»; Я исправил это в своих примерах кода.

I have the following c# code to call stored procedure testproc, but when I run this application it says that it could not find stored procedure testproc.

This is my c# code behind to call the stored procedure:

SqlConnection con = new SqlConnection();
con.ConnectionString = "data source='example.com';user id='sa';password='password';persist security info=False;initial catalog=Test;Connect Timeout=100; Min Pool Size=100; Max Pool Size=500";
con.Open();

DataSet ds = new DataSet();
SqlCommand com = new SqlCommand("testproc",con );
SqlDataAdapter sqlda = new SqlDataAdapter(com);
//sqlda.SelectCommand.CommandText = "SELECT Id,Name1,ZipCode,StreetName,StreetNumber,State1,Lat,Lng,Keyword, ( 6371 * ACOS( COS( (12.925432/57.2958) ) * COS(  (Lat/57.2958)  ) * COS( ( Lng/57.2958 ) - (77.5940171/57.2958) ) + SIN( 12.925432/57.2958 ) * SIN(  Lat/57.2958  ) ) ) AS distance FROM Business_Details where( (StreetName like '%jayanagar%')and (Keyword like '%plumbing%' ))ORDER BY distance;";
//sqlda.CommandText = "select * from business where(( distance<'" + radius + "' )and (StreetName like '%" + streetname + "%')and (Keyword like '%" + keyword1 + "%' )) order by distance";
//com.CommandText = "testproc ";
com.CommandType = CommandType.StoredProcedure;
com.Parameters.Add(new SqlParameter("@lat1",SqlDbType.Float,50,lat1));
com.Parameters.Add(new SqlParameter("@lng1",SqlDbType.Float,50,lng1));
com.Parameters.Add(new SqlParameter("@radius1",SqlDbType.Int,10,radius1));
com.Parameters.Add(new SqlParameter("@streetname", SqlDbType.VarChar, 50, streetname));
com.Parameters.Add(new SqlParameter("@keyword1", SqlDbType.VarChar, 50, keyword1)); 
com.Parameters[0].Value = lat1;
com.Parameters[1].Value = lng1;
com.Parameters[2].Value = radius1;
com.Parameters[3].Value = streetname;
com.Parameters[4].Value = keyword1;
try
{                
    sqlda.Fill(ds);
    con.Close();
}
catch (Exception e)
{
    con.Close();
}

This is my stored procedure I have written in sql server. It runs successfully in SQL server

USE [Test]
GO
/****** Object:  StoredProcedure [dbo].[tesproc]    Script Date: 09/01/2010 13:00:54 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
 ALTER PROCEDURE [dbo].[tesproc]
    -- Add the parameters for the stored procedure here
    @a float, @b float, @d int,@s varchar(50),@k varchar(50)
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
    select Id, Name1,ZipCode,StreetName,StreetNumber,State1,Lat,Lng , ( 6371 * ACOS( COS( (@a/57.2958) ) * COS(  (Lat/57.2958)  ) * COS( ( Lng/57.2958 ) - (@b /57.2958) )  + SIN( @a/57.2958 ) * SIN(  Lat/57.2958  ) ) ) as distance from business_details where (( 6371 * ACOS( COS( (@a/57.2958) ) * COS(  (Lat/57.2958)  ) * COS( ( Lng/57.2958 ) - (@b /57.2958) )  + SIN( @a/57.2958 ) * SIN(  Lat/57.2958  ) ) )<@d and StreetName like '%'+ @s + '%' and Keyword like '%'+ @k +'%')
END

   Sponger

11.11.15 — 13:34

Все привет.

Есть проблема.

Вызываю хранимую процедуру Oracle, но выдает ошибку. Ругается на параметры, но не могу догнать в чем беда. Помогите плиз.

Это хранимка

p_lastdate — передаваемый параметр, дата

p_rates — курсор

pkg_1c_api.get_rate(p_lastdate => :p_lastdate, p_rates => :p_rates);

не понимаю что надо передать в p_rates

Попытка

Connection = Новый COMОбъект(«ADODB.Connection»);

Connection.Provider = «OraOLEDB.Oracle.1»;

Connection.ConnectionString = «моя строка подключения»;

Connection.Open();

        
adCmdStoredProc = 4;

    
adParamInput = 1;

        
adDate = 7;

        
Cmd = Новый COMОбъект(«ADODB.Command»);

Cmd.ActiveConnection = Connection;

Cmd.CommandText = «pkg_1c_api.get_rate»;

Cmd.CommandType = adCmdStoredProc;

    
Param1 = Cmd.CreateParameter(«@p_lastdate», adDate, adParamInput, 4, Дата(2015,10,1));

Cmd.Parameters.Append(Param1);

        
//Param2 = Cmd.CreateParameter(«p_rates», adNumeric, adParamOutput, 4, NULL);

//Cmd.Parameters.Append(Param2);

        
Попытка

RecordSet = Новый COMОбъект(«ADODB.RecordSet»);

RecordSet = cmd.Execute(); // вот в этой строке ошибка

Пока (RecordSet.State=0) цикл

RecordSet=RecordSet.NextRecordset();

КонецЦикла;

Исключение

Предупреждение(ОписаниеОшибки());

Отказ = Истина;

КонецПопытки;        

Исключение

Предупреждение(«Не удалось создать подключение!»);

КонецПопытки;

   Sponger

1 — 11.11.15 — 13:39

Ошибка

ORA-06550: строка1, столбец7: PLS-00306: ошибочно число или типы аргументов при обращении к GET_RATE

ORA-06550: строка1, столбец7

PL/SQL: Statement ignored

   mistеr

2 — 11.11.15 — 13:45

(0) > не понимаю что надо передать в p_rates

Сказано же — курсор. В 1С такого зверя нет. Получить его можно в PL/SQL или, если хитро извернуться, в программе на C++.

Если переформулировать для блондинок, эта хранимка не предназначена для вызова из 1С.

   Sponger

3 — 11.11.15 — 13:54

т.е. хранимку надо переписать чтобы она возвращала курсор не в параметр?

   Sponger

4 — 11.11.15 — 13:58

ПЕРЕФРАЗИРУЮ

надо переписать чтобы возвращала не курсор, а таблицу (набор записей, RECORDSET)

c Oracle впервые пытаюсь вытащить что-то

   mistеr

5 — 11.11.15 — 13:59

(3) Да, сделать обертку-функцию.

   Sponger

6 — 11.11.15 — 14:19

(5) она должна делаться в Oracle?

   Sponger

7 — 11.11.15 — 14:22

а вот такой вариант делал ктонить?

— Установить (ИМХО лучше на сервере mssql) клиента Oracle

— Настроить ODBC к Oracle

— в mssql настроить Linked Servers к ораклу

— написать хранимку в mssql, которая будет принимать ваши параметры и транслировать в хранимку на оракле, возвращая вам результат. ИЛИ делать выборку из представления…

— в оракле написать хранимку по сбору нужных данных или представление, из которого сиквеловский скрипт будет селектить данные (в зависимости от условий — возможно это даже предпочтительней)

В Oracle для меня никто не будет ничего переписывать.

Потому надо найти выход.

   МихаилМ

8 — 11.11.15 — 14:37

сделайте обертку — psql скрипт.

и вызывайте не хранимую процедуру , а комманду — скрипт , который будет вызвать хранимую процедуру.

   Sponger

9 — 11.11.15 — 14:44

(8) я и спрашиваю. Обертку в Oracle делать?

   Sponger

10 — 11.11.15 — 14:45

(8) примеры не скинете ссылку?

   mistеr

11 — 11.11.15 — 14:48

(6) Можно попробовать в анонимном блоке.

(7) Код хранимки есть?

   Sponger

12 — 11.11.15 — 15:01

(11) Завтра попробую код хранимки взять

   Sponger

13 — 12.11.15 — 06:58

(11) с кодом засада. Не будет кода.

Только вызов и входящие параметры. я уже написал их.

   Sponger

14 — 12.11.15 — 06:59

(8) примеры не скинете или ссылку на описание как делать?

   Repey

15 — 12.11.15 — 07:28

Это у тебя все же процедура или функция?

Дай пример вызова прямо из оракла.

   Sponger

16 — 12.11.15 — 10:46

(15) процедура.

Ораклоиды код не дают. Первый раз Оракл вижу, и надо получить данные.

Вот все что есть.

pkg_1c_api.get_rate(p_lastdate => :p_lastdate, p_rates => :p_rates);

p_lastdate — передаваемый параметр, дата

p_rates — курсор

   mistеr

17 — 12.11.15 — 11:45

(16) Единственное, что могу сказать. Если бизнесу нужны эти данные в 1С, все административные препятствия преодолеваются на раз. Выходи на заинтересованных лиц и решай вопрос. Иногда кодер должен на минутку становиться манагером.

   Repey

18 — 12.11.15 — 12:34

(16) То есть это процедура, и она тебе возвращает курсор «p_rates»?

   Sponger

19 — 12.11.15 — 13:06

(18) да.

   Repey

20 — 12.11.15 — 13:19

(19) Сколько полей на выходе должно получиться?

Ориентировочное количество записей?

   Sponger

21 — 12.11.15 — 13:26

В курсоре сейчас

       CURR_ID    RATE    FROMDATE    CURRENCYCODE    TEXT    ISOCODE

1    1    273,53    08.10.2015 23:59:59    USD    Американский доллар    840

   Sponger

22 — 12.11.15 — 13:28

блин, нет форматирования.

Получается 6 полей.

   Repey

23 — 12.11.15 — 14:06

А записей сколько?

Если немного — можно собрать результат в строку с разделителями, а на стороне 1С уже разобрать ее.

Иначе вижу только вариант с временной таблицей.

В любом случае, считаю, это будет лучше, чем доп. звено добавлять.

Развивать тему?

   Sponger

24 — 12.11.15 — 14:23

(23) может в личку?

пока в курсоре у меня 1 запись.

Но мне надо понять механизм.

В дальнейшем будет много.

Я бы не отказался от обоих вариантов и с разделителями и с временной таблицей.

   Sponger

25 — 12.11.15 — 14:29

вот код хранимки

select * from table(pkg_1c_api.get_rate(p_lastdate => to_date(‘01.10.2015′,’dd.mm.yyyy’)))

   mistеr

26 — 12.11.15 — 15:47

(25) Вот и делай такой же select, через Statement.

   Sponger

27 — 13.11.15 — 05:57

(26) что есть Statement?

Как мне его из 1С организовать?

   Мэс33

28 — 13.11.15 — 06:19

   Мэс33

29 — 13.11.15 — 06:24

   mistеr

30 — 13.11.15 — 10:22

(27) Не, Statement это я напутал. Тот же Command, только с другим CommandType.

   Sponger

31 — 13.11.15 — 10:25

(28) спрасибо.

        
НаборЗаписей = Connection.Execute(«select * from table(pkg_1c_api.get_rate(‘»+ Формат(ТекДата, ФорматДаты) + «‘))»);

        
Для каждого СтрокаИтем Из НаборЗаписей.Fields Цикл

    Если ТЗ.Колонки.Количество() <> НаборЗаписей.Fields.Count Тогда

        НоваяСтрока[СтрокаИтем.Name] = СтрокаИтем.Value;

    КонецЕсли;

КонецЦикла;        

вот так заработало. Правда у меня в курсоре 1 строка. Щас проверю с набором строк.

   Sponger

32 — 13.11.15 — 10:43

да. Таким методом я получаю набор строк, но работаю только с первой строкой набора.

Как получить все строки?

  

Sponger

33 — 13.11.15 — 10:46

Протупил.

НаборЗаписей.moveNext()

работает.

Модератор: Модераторы

Ошибка при вызове хранимой процедуры MySQL

Создал в MySQL хранимую процедуру:

Код: Выделить всё
CREATE PROCEDURE fifo (in id_inp BIGINT, OUT Ret_code int)
....

Процедура успешно отрабатывает если запускать ее из консоли или phpmyadmin.
При попытке вызвать ее из программы на Lazarus получаю сообщение об ошибке.
Procedure fifo can`t return a result set in the given context.
Код:

Код: Выделить всё
SQLQuery1.Active:=false; SQLQuery1.SQL.Clear;
   SQLQuery1.SQL.Add('CALL fifo('+inttostr(id_document)+',@result)');
   SQLQuery1.ExecSQL;

Пробовал SQLQuery1.open — пишет, что открывать можно только select запросы.
По результатам гугления добавил в mysql50connection.params

Код: Выделить всё
CLIENT_MULTI_STATEMENTS=true
CLIENT_MULTI_RESULTS=true

Не помогло. не дает запускать вообще никакие хранимые процедуры. Запросы на выборку и обновление работают.
Никто не встречал подобного? Как лечить?
Спасибо.

Использую:
libmysql.so.14
fpc 2.6.0
Lazarus SVN 2013-03-05 GTK2

volodya25
новенький
 
Сообщения: 10
Зарегистрирован: 03.11.2011 22:33:23
Откуда: Украина

Re: Ошибка при вызове хранимой процедуры MySQL

Сообщение Ism » 16.10.2013 17:49:18

Вы хотите получить результат давая запрос на исполнение, процедуре некуда возвращать результат
Возможно нужно сделать функцию и сделать так

Код: Выделить всё
SQLQuery1.SQL.Add('select fifo('+inttostr(id_document)+') as Field)
SQLQuery1.Open
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Re: Ошибка при вызове хранимой процедуры MySQL

Сообщение EmeraldMan » 16.10.2013 18:00:49

До недавнего времени, действительно SQLQuery1.Open на запрос CALL, возвращяемой значения процедуры, выдавал ошибку.
Точно не помню с какой версии все заработало. В Lazarus 1.0.8 и FPC 2.6.2 — данной проблемы уже нет. В более поздних так же должно работать.

Ism, во многих случаях возможностей функции просто не хватает. Бывает надо в конце выполнения вывести многострочный результат в виде таблицы. По моему, в функции так же запрещены транзакции, в процедурах их можно использовать.

Аватара пользователя
EmeraldMan
постоялец
 
Сообщения: 149
Зарегистрирован: 16.10.2008 08:41:51
Откуда: Белгород
  • Профиль
  • Сайт
  • ICQ

Re: Ошибка при вызове хранимой процедуры MySQL

Сообщение volodya25 » 16.10.2013 22:46:25

Переделать процедуру на функцию не получилось — иногда возможен многострочный результат.
Получаю ошибку «Not allowed to return a result set from a function»
Попробую обновить Lazarus и FPC.

volodya25
новенький
 
Сообщения: 10
Зарегистрирован: 03.11.2011 22:33:23
Откуда: Украина

Re: Ошибка при вызове хранимой процедуры MySQL

Сообщение Ism » 17.10.2013 15:01:30

volodya25 писал(а):Переделать процедуру на функцию не получилось — иногда возможен многострочный результат.
Получаю ошибку «Not allowed to return a result set from a function»
Попробую обновить Lazarus и FPC.

Возвращайте в виде строки с разделителями. Вообще в mysql есть временные таблицы
В zeosdbo получение из функции работает

Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Re: Ошибка при вызове хранимой процедуры MySQL

Сообщение volodya25 » 18.10.2013 11:58:03

Установил ZeosDBO и все заработало.
Всем спасибо. Вопрос закрыт.

volodya25
новенький
 
Сообщения: 10
Зарегистрирован: 03.11.2011 22:33:23
Откуда: Украина


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 3

  • Ошибка при вызове функции криптоплагина signhash error росимущество
  • Ошибка при вызове функции криптоплагина signhash error росаккредитации
  • Ошибка при вызове метода контекста установитьпредставлениевыражений
  • Ошибка при вызове метода контекста установитьпометкуудаления
  • Ошибка при вызове метода контекста установитьмонопольныйрежим