Solved

mySQL query with function in a different database?

Posted on 2014-04-14
4
347 Views
Last Modified: 2014-04-21
- I have a database called REFERENCE.  It stores my functions and stored procs,
e,g,  procDoSomeStuff() with code like SELECT stuff FROM localDatabase;
- I have a multitude of databases containing data.
e.g. DATABASE1

I am in DATABASE1 issuing a long list of queries, some using functions.
e.g. CALL REFERENCE.procDoSomeStuff;

Problem is, REFERENCE.procDoSomeStuff() thinks that all its queries should be executed in the scope of REFERENCE.
It looks for REFERENCE.localDatabase rather than DATABASE1.localdatabase as I was expecting:  in other words, it looks like REFERENCE procedures are not really "loaded" into the DATABASE1, they spin off their commands into REFERENCE.  Weird.

So how do I "parametize" the database name?  How do I modify my SP and functions in REFERENCE to accept a database name I supply?  Or if it is easier, convince that all the code in a function should run in DATABASE1

I have lots of databases, but all use the same functions and stored procs, hence the need to share them in a common database I can call.

Many Thanks.
0
Comment
Question by:FKoutchouk
  • 2
4 Comments
 
LVL 34

Expert Comment

by:Dan Craciun
ID: 40000830
Probably overkill for your needs, but if you're comfortable with C++ you can write your functions as UDF (user defined functions): http://dev.mysql.com/doc/refman/5.0/en/adding-udf.html

That would have the advantage that your functions would work just like native MySQL functions and will be available for all databases.

HTH,
Dan
0
 
LVL 142

Accepted Solution

by:
Guy Hengel [angelIII / a3] earned 500 total points
ID: 40001255
I confirm, please read up from here:
http://dev.mysql.com/doc/refman/5.0/en/stored-routines-syntax.html
 As of MySQL 5.0.1, a stored procedure or function is associated with a particular database. This has several implications:
    When the routine is invoked, an implicit USE db_name is performed (and undone when the routine terminates). USE statements within stored routines are not permitted.
.... 

Open in new window

so, you cannot do it with mysql, unless you specify the database you want to use the tables/views/etc in an parameter, and inside the procedure you use dynamic sql ...
http://dev.mysql.com/doc/refman/5.0/en/sql-syntax-prepared-statements.html

which will presumably not be much simpler to implement neither ..
0
 
LVL 1

Author Comment

by:FKoutchouk
ID: 40004910
I got it to work by modifying my numerous stored procedures, using the technique:

	SET @myQuery = CONCAT[into a query];
	PREPARE stmt1 FROM @myQuery;
	EXECUTE stmt1;
	DEALLOCATE PREPARE stmt1;

Open in new window


Which leaves the functions.  They now all generate the following error:
Dynamic SQL is not allowed in stored function or trigger

Half way down that page, it confirms that I cannot do dynamic SQL in a function.

Any way around in SQL -- I cannot use an external program (like C++ as Dan suggested, thank you)?
Perhaps turn the functions into procedures, write to a temporary database1.table, then read from that in the continuing code?

And for my own education, why in the world are procedures supporting dynamic SQL and not the functions?
0
 
LVL 142

Expert Comment

by:Guy Hengel [angelIII / a3]
ID: 40005901
mysql was open-source, and volunteers worked on the features. if nobody asked for this feature, or nobody was assigned the task, it simply wasn't developed.
there may also be technical issues on this, as for example in MS SQL it's not possible neither to have dynamic sql in functions ...
0

Featured Post

Complete VMware vSphere® ESX(i) & Hyper-V Backup

Capture your entire system, including the host, with patented disk imaging integrated with VMware VADP / Microsoft VSS and RCT. RTOs is as low as 15 seconds with Acronis Active Restore™. You can enjoy unlimited P2V/V2V migrations from any source (even from a different hypervisor)

Join & Write a Comment

Suggested Solutions

Title # Comments Views Activity
Access Query 4 35
Filter by data and current_date 4 30
PHP loop not working 4 33
Insert data into database 2 15
Popularity Can Be Measured Sometimes we deal with questions of popularity, and we need a way to collect opinions from our clients.  This article shows a simple teaching example of how we might elect a favorite color by letting our clients vote for …
This article describes how to use the timestamp of existing data in a database to allow Tableau to calculate the prior work day instead of relying on case statements or if statements to calculate the days of the week.
Here's a very brief overview of the methods PRTG Network Monitor (https://www.paessler.com/prtg) offers for monitoring bandwidth, to help you decide which methods you´d like to investigate in more detail.  The methods are covered in more detail in o…
This video gives you a great overview about bandwidth monitoring with SNMP and WMI with our network monitoring solution PRTG Network Monitor (https://www.paessler.com/prtg). If you're looking for how to monitor bandwidth using netflow or packet s…

744 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

12 Experts available now in Live!

Get 1:1 Help Now