Не уверен, почему вы хотите раздавать 4 переменные, когда вы можете просто вернуть набор результатов.Это также избавит вас от необходимости менять интерфейс sproc каждый раз, когда вы хотите расширить выводимые данные.
MySQL
drop procedure if exists XofferCommon.getCdpc;
delimiter #
create procedure XofferCommon.getCdpc
(
in p_city_id int unsigned
)
begin
select
t.Id as country_id,
d.Id as district_id,
p.Id as provence_id,
c.Id as city_id
from
tblCity c
inner join tblProvence p on c.tblProvence_Id = p.Id
inner join tblDistrict d on p.tblDistrict_Id = d.Id
inner join tblCountry t on d.tblCountry_Id = t.Id
where
c.Id = p_city_id;
end#
delimiter ;
PHP
<?php
ob_start();
try
{
$db = new mysqli("localhost", "foo_dbo", "pass", "foo_db", 3306);
if ($db->connect_errno)
throw new exception(sprintf("Could not connect: %s", $db->connect_error));
$sqlCmd = sprintf("call getCdpc(%d)", 1);
$result = $db->query($sqlCmd);
if(!$result) throw new exception(sprintf("Invalid query : %s", $sqlCmd));
if($result->num_rows <= 0){
echo "no records found !";
}
else{
$row = $result->fetch_assoc();
echo sprintf("country_id = %d district_id = %d, provence_id = %d, city_id = %d",
$row["country_id"],$row["district_id"],$row["provence_id"],$row["city_id"]);
}
$db->next_result();
$result->close();
}
catch(exception $ex)
{
ob_clean();
echo sprintf("zomg borked - %s", $ex->getMessage());
}
if(!$db->connect_errno) $db->close();
ob_end_flush();
?>
Это такжестоит потратить время на очистку вашей схемы, чтобы у вас было больше подходящих целочисленных типов данных для ваших ключей (не все это целые 4 байта со знаком) и избегайте смешивания имен полей, которые вы, кажется, выбрали для того же самого, то есть Id, ID, City_Id,City_ID и т. Д., Что позволит избежать всего этого ненужного псевдонима!
http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html
Исправленная схема MySQL
- удален префикс имени таблицы tbl
- выбранныйболее подходящие целочисленные типы данных для ваших ключей
- переименовали ваши ключевые поля, чтобы они были согласованными, то есть city_id
Таблицы
drop table if exists country;
create table country
(
country_id tinyint unsigned not null auto_increment primary key -- 0 to 255 countries;
)
engine=innodb;
drop table if exists district;
create table district
(
district_id smallint unsigned not null auto_increment primary key, -- 0 to 65535 districts
country_id tinyint unsigned not null
)
engine=innodb;
drop table if exists provence;
create table provence
(
provence_id smallint unsigned not null auto_increment primary key, - 0 to 65535 provences
district_id smallint unsigned not null
)
engine=innodb;
drop table if exists city;
create table city
(
city_id mediumint unsigned not null auto_increment primary key, - 0 to 16777215 cities
provence_id smallint unsigned not null
)
engine=innodb;
Хранимая процедура
drop procedure if exists getCdpc;
delimiter #
create procedure getCdpc
(
in p_city_id mediumint unsigned
)
begin
select
t.country_id,
d.district_id,
p.provence_id,
c.city_id
from
city c
inner join provence p on c.provence_id = p.provence_id
inner join district d on p.district_id = d.district_id
inner join country t on d.country_id = t.country_id
where
c.city_id = p_city_id;
end#
delimiter ;
Надеюсь, это поможет:)