2011-06-22 16 views
1

私の仕事でPHP関数を修正するように求められています。 )これはodbc_exec(を使用してデータベースを照会Db2範囲から選択

function select($cols, $table, $cond, $order, $start, $max); 

)及び(odbc_num_rowsと行の数を返す:プロトタイプです。ファンクションコードは次のようになります。

$this->query = "SELECT $cols FROM $table "; 
if($cond) $this->query .= "WHERE $cond"; 
if($order) $this->query .= " ORDER BY ".$order; 

この関数は多くの場所で使用されているため、ゼロから書き込むことはできません。それは多くのテーブルからレコードを取得します。昨日まで、$ max変数を使用していなかったので、データベースからすべてのレコードを読み込んでいました。彼らは、iSeries Access ODBCドライバーを使用しています。答えはhereですが、見つかりませんでした。

$ start変数を使用して$ startから読み込みを開始し、$ max行を読みたいとします。 $ startが100と$ max 50の場合、100から150までのレコードを取得したいと思います。私は昨日、この部分を追加しました:

私の問題に役立つものは何も見つかりませんでした。私はIDなどを使って1つのテーブルでそれを行うことができることを知っています。しかし、私は一般的な解決策を探しています。

+0

相対レコード番号RRN(library.tablename)が役立ちますか?それはレコードがテーブルに入力された順序によく似ています...クエリのソート順に基づいてレコード100〜150を探していますか? – Leslie

答えて

0

を、私は問題を解決しました。

まず、$ colsの各列名を$ table.columnNameにphpで変換する必要があります。

$this->query .= " (SELECT ROW_NUMBER() OVER() AS rownum, $convertedColumns 
         FROM $table) AS tmp WHERE rownum > ". $start ." " ; 
if($max) { 
    $last = $start + $max; 
    $this->query .= " AND rownum <= ". $last . " "; 
} 

、結果としてクエリは次のようになります。

SELECT $cols FROM 
    (SELECT ROW_NUMBER() OVER() AS rownum, $convertedCols) AS tmp 
WHERE rownum > $start AND rownum <= $max 
+0

ROW_NUMBER()関数呼び出しでORDER BY句が指定されていないと、一度に1ページずつ結果をスクロールしようとするプロセスに対して、予期しない結果が生じる可能性があります。一貫性のあるソート結果を生成するORDER BYを使用しても、このアプローチを使用するスクロール・リーダーは、INSERT、UPDATE、およびDELETEによって他の接続から送信される予期しないギャップから保護されません。 –

+1

変更する必要がありますか?彼らはまだコードをサーバーに置いていませんでした。 ORDER BYでも問題が発生する場合は、このように受け入れるべきですか? – mce

+0

良い質問です。ページネーションサービスがそのまま受け入れられるかどうかの答えは、複数ページの結果を反復処理する際のアプリケーションの矛盾に対する許容差によって異なります。基本的なパターンは、プログラマにとって非常に便利な契約を約束しています(*、何も選択する必要はありません。結果セットに直接カーソルを置かずに、ページごとの結果リストを得ることができます)データベース接続)、それはプログラマを警戒するかもしれない(そしてそうすべきである)いくつかのトレードオフを行うことによってそうしている。 –

0

多分これは役立ちます:

SELECT DB2 LIMIT

+0

ありがとうございます。残念ながら、OVER(ORDER BY COL1)で列名を使用しています。私はいつもカラム名を取得しないかもしれません。彼らは単に "*"を使うことができます。 – mce

関連する問題