6

PHP で ODBC 経由で 2 つのストアド プロシージャを順番に呼び出す必要があります。

#run stored procedure 1
$query = "Shipped_Not_Shipped_Rep ".$_GET['rep_id'];
$result = odbc_exec($dbh, $query);
odbc_result_all($result);

#run stored procedure 2
$query = "Shipped_Not_Shipped_Account ".$_GET['account_id'];
$result = odbc_exec($dbh, $query);
odbc_result_all($result);

2 番目のストアド プロシージャ呼び出しの後、PHP で次のエラーが発生します。

警告: odbc_exec() [function.odbc-exec]: SQL エラー: [unixODBC][FreeTDS][SQL Server]無効なカーソル状態、SQLExecDirect の SQL 状態 24000

ストアド プロシージャを呼び出す順序を並べ替えると、常に 2 番目にエラーが発生します。呼び出しの間にカーソル位置をリセットする方法はありますか? ここで私の要素から少し外れています。

4

7 に答える 7

4

データベースへの 2 つのハンドルを開きます。ODBC は、ハンドル内にカーソルを保持している可能性があります。

于 2009-11-18T00:01:13.877 に答える
2

私も正確な問題を見つけました。どうやら、これは無料の ODBC ドライバーで一般的です。これは、MySQL から ODBC SQL Server にプロジェクトを移行しようとした朝の頭痛の種でした。私はついにこれを取り除くものを見つけました。

このエラーは、アクティブなカーソルがまだ前の結果セットから存在するために表示されます。新しいレコードを発行する前に、最初のレコード セット全体を (その一部のみを使用している場合でも) 確実に読み取ることで、切断/再接続メソッドを使用せずにこのエラーを取り除くことができました。注: PHP を使用しています。

エラーが表示されます:

$sql="SELECT COUNT(whatever) as whatever FROM whatever";<br />
$countResult = odbc_exec($db, $sql);<br />
$countMenuHeader = odbc_fetch_array($countResult);<br />
extract ($countMenuHeader);<br />
$countRecords = $NumMenuHeader;<br />

$sql="SELECT whatever as whatever FROM whatever";<br />
$result = odbc_exec($db, $sql);<br />
$MenuHeader = odbc_fetch_array($result);<br />

エラーをクリアしました:

 $sql="SELECT COUNT(whatever) as whatever FROM whatever";<br />
 $countResult = odbc_exec($db, $sql);<br />

 while($countMenuHeader = odbc_fetch_array($countResult))<br />
 {<br />&nbsp;&nbsp;
 extract ($countMenuHeader);<br />&nbsp;&nbsp;
 $countRecords = $NumMenuHeader;<br />}

 $sql="SELECT whatever as whatever FROM whatever";<br />
 $result = odbc_exec($db, $sql);<br />
 $MenuHeader = odbc_fetch_array($result);<br />

つまり、次のステートメントに移動する前に、データセットを完全に読み取るかフェッチしてください。

于 2011-05-24T15:28:20.697 に答える
2

私は同じ問題に遭遇しましたがodbc_free_result($result)、2つのクエリの間でうまくいきました。

ドキュメンテーション:

bool odbc_free_result ( resource $result_id )

結果に関連付けられた空きリソース。

odbc_free_result()スクリプトの実行中にメモリを使いすぎることが心配な場合にのみ呼び出す必要があります。スクリプトが終了すると、すべての結果メモリが自動的に解放されます。

注: 自動コミットが無効になっている場合 (「 」を参照odbc_autocommit())、コミットする前に呼び出すとodbc_free_result()、保留中のすべてのトランザクションがロールバックされます。

于 2014-03-31T08:40:53.767 に答える
0

$result1と$result2という異なるカーソルを使用して結果にアクセスしてみてください。

于 2009-11-17T23:16:32.733 に答える
0

PHP で unixODBC と freeTDS を使用してネストされたクエリを開くための回避策

odbc.ini を変更できる場合は、同じ接続情報で別のセクション名を使用して別の構成セクションを作成します。

[DATASOURCE1]
Description = "Data Connection 1"
Driver = FreeTDS
Server = <your server>
Port = 1433
Database = <your db>

[DATASOURCE1A]
Description = "Data Connection 2"
Driver = FreeTDS	
Server = <your server>
Port = 1433
Database = <your db>

次に、コードで、データ ソースの説明ごとに 1 つずつ、2 つのハンドルを作成します。

$dbhandle = odbc_connect('DATASOURCE1', 'user', 'password');
$dbhandle1 = odbc_connect('DATASOURCE1A', 'user', 'password');

次に、ネストされたクエリでハンドルを使用できます。

$dbresult = odbc_exec($dbhandle, "SELECT <some sql>");
while($row = odbc_fetch_array($dbresult)) {

	$dbresult1 = odbc_exec($dbhandle1, "<some different sql>");

	while($row1 = odbc_fetch_array($dbresult1)) {
		
		#do stuff with nested query data like $row['name'] and $row1['time']
	}
}

より深くネストすることもできますが、レベルごとに odbc.ini エントリを作成する必要があります。きれいではありませんが、複数のカーソルが利用可能になるまではうまくいきます。

于 2015-04-17T17:40:01.767 に答える