mysql - une - tutoriel procédure stockée sql server




Est-il possible d'appeler une procédure stockée MySQL à partir de Ruby? (2)

Cela fonctionnerait-il pour envelopper la procédure dans une fonction? Si le barfing de Ruby en raison de l'absence de lignes renvoyées ( ...can't return a result set in the given context... ), cela peut le réparer:

DELIMITER $

CREATE PROCEDURE tProc()
BEGIN
    SET @a = 'test';
END;
$

CREATE FUNCTION tFunc()
RETURNS INT
BEGIN
    CALL tProc();
    RETURN 1;
END;
$

DELIMITER ;

SELECT tFunc() FROM DUAL;
>> 1

SELECT @a FROM DUAL;
>> 'test'

Bien que, de façon réaliste, ce n'est pas une solution très extensible.

Suivi: Je suis assez nbyby chez Ruby / ActiveRecord, mais cet exemple fonctionne vraiment

ActiveRecord::Base.establish_connection(authopts)

class TestClass < ActiveRecord::Base
end

test_class = TestClass.new
puts %{#{test_class.connection.select_one('SELECT tFunc() AS tf FROM DUAL')}}
>> tf1

L'utilisation de CALL tProc() provoqué une erreur similaire à la vôtre.

Lorsque j'essaie d'appeler une procédure stockée à partir de Rails, j'obtiens cette exception:

ActiveRecord::StatementInvalid: Mysql::Error: PROCEDURE pipeline-ws_development.match_save_all can't return a result set in the given context: call match_save_all()
    from /Users/otto/Projects/Futures/src/pipeline-ws/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb:150:in `log'
    from /Users/otto/Projects/Futures/src/pipeline-ws/vendor/rails/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb:281:in `execute'
    from (irb):3

Il y a une page dans le Wiki Rails qui traite d'un correctif pour l'adaptateur MySQL qui résout ce problème, mais il est obsolète et ne semble plus fonctionner.

Le code de configuration active les procédures stockées correctement, mais le problème call_sp la connexion est désynchronisée après un appel de procédure stockée et que la nouvelle méthode call_sp ne fonctionne plus.

Des suggestions sur la façon de faire fonctionner cela?

C'est le code que j'utilise:

ActiveRecord::Base.connection("call storedproc()")

Il lève la même exception si storedproc() renvoie des résultats ou non.


Utilisez-vous ActiveRecord :: Base.connection.execute? Cette méthode devrait vous permettre d'exécuter une instruction SQL arbitraire qui n'est pas naïvement prise en charge dans le wrapper Active Record.





stored-procedures