2

ケース: 次のようなストアド プロシージャ:

DROP PROCEDURE IF EXISTS `XofferCommon`.`getCdpc`;<br>
DELIMITER $$<br>
CREATE PROCEDURE `XofferCommon`.`getCdpc` (IN in_city_ID INT, OUT out_country_id INT, OUT out_district_id INT, OUT out_provence_id INT, OUT out_city_id INT)<br>
BEGIN<br>
DECLARE city_ID INT DEFAULT in_city_ID;<br>
SELECT t.Id, d.Id, p.Id, c.Id INTO out_country_id, out_district_id, out_provence_id, out_city_id FROM ((tblCity AS c INNER JOIN tblProvence AS p ON c.tblProvence_Id = p.ID) INNER JOIN tblDistrict AS d ON p.tblDistrict_Id = d.ID) INNER JOIN tblCountry AS t ON -d.tblCountry_Id = t.ID WHERE c.id = city_ID;<br>
END$$<br>
DELIMITER ;<br><br>
<br>---------------------------------------------------
Input: int referring to in_city_id<br>
Output: 4 x int country district provence and city id's<br>
---------------------------------------------------<br>

Php: プロシージャを呼び出して、返された 4 つのオブジェクトを 4 つの変数に格納したい

if ($res = $mysqli->query( 'CALL getCdpc(1321,@co,@di,@pr,@ci);SELECT @co,@di,@pr,@ci'))<br>
{<br>
    while($row = $res->fetch_object())<br>
    {<br>
        print($row);<br>
    }<br>
    $res->close();<br>
}<br>
else<br>
{<br>
    print "<br> no result given <br>";<br>
}<br>
<br>
Result:<br>
-------<br>

私は常にゼロ行を返します

<br>
<br>
More info:<br>
----------<br>
in mysql sql the results get returned when I do:<br>
->call xoffercommon.getCdpc(1321,@co,@di,@pr,@ci);<br>
->select @co,@di,@pr,@ci;<br>
=> @co @di @pr @ci<br>
   1   2   3   4<br>
<br>
Question:<br>
---------<br>

プロシージャの呼び出しとその結果の選択という 2 つのクエリを実行する必要がありますか?
1行で実行する方法はありますか?
...私の問題の解決策がどこにも見つからなかったので、助けてください。すでにプロシージャでリターンを試みましたが、これは関数でのみ許可されています。すでに 2 週間が経過しています... 読書/試行錯誤によって多くのことを学びました ;-)、しかし、このケースを解決するものは何もありませんでした....

4

2 に答える 2

5

単に結果セットを返すことができるのに、なぜ 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 ;

お役に立てれば :)

于 2011-02-09T09:08:15.750 に答える
0

multi_query 関数を使用する

$mysqli->multi_query($query)

例を見て

PHP + MySql + ストアド プロシージャ、「出力」値にアクセスするにはどうすればよいですか?

于 2011-02-09T06:48:04.523 に答える