-1

ユーザーに関する情報を保持する何百万ものレコード、BLOB 内のユーザーのドキュメント、および行ごとのファイル サイズを保持する列を含むテーブルがあります。レポート中に、これらすべてのレコードを添付ファイルとともに抽出し、フォルダーに保存する必要があります。ただし、フォルダーのサイズが 4GB を超えないようにする必要があります。

私が必要としているのは、ファイル サイズの合計が 4GB 未満になるレコードまでのみレコードを取得することです。私はデータベースの経験がほとんどなく、参照できる DB の専門家もいません。

たとえば、 sum(fileSize) < 9 になるまでレコードのみをフェッチする必要があるとします。

Name fileSize
A       1
B       2
C       3
D       2
E       9
F       4

私のクエリは、レコード A、B、C、および D を返す必要があります。また、別の後続のプロセスのために、最初と最後のレコードの rowID/uniqueID を保存する必要があります。使用されている DB は IBM DB2 です。

ありがとう!


呼び出し自体に直接値を含めるのではなく、パラメーター化された SQL を使用する必要があります。次のようなものです:

// The ... is because I didn't want to count the huge number of parameters...
// You'll need to fill in the right number of question marks.
String sql = "{call adminproduct(?, ?, ?, ?, ?, ...))}";
stmt = con.prepareCall(sql);
stmt.setString(1, pid);
stmt.setString(2, pname);
// Etc... all the parameters
stmt.executeUpdate(sql);   

呼び出し元がストアド プロシージャであるかバニラ SQL であるかに関係なく、変数値を SQL 内に直接含めないでください。パラメーター化された SQL を使用することには、主に次の 3 つの利点があります。

  • SQL インジェクション攻撃から保護します
  • 面倒な変換を回避します (特に日付/時刻フィールドの場合)。
  • SQL を値から分離することで、コードをよりクリーンに保ちます。(文字列を連結しなくても、SQL ははるかに読みやすくなります。)
4

1 に答える 1

-1

そこで、ファイルサイズを見つける方法をいくつか紹介します。手順ではデータで管理できます。

ファイルから長さ (file_data) を選択

どこで長さ (file_data)<99999999;

長さ(ファイル_データ)

        82944
        82944
        91136

3 行が選択されました。

ファイルから dbms_lob.getlength(file_data) を選択

どこで長さ (file_data)<89999;

DBMS_LOB.GETLENGTH(FILE_DATA)

                    82944
                    82944

2 行が選択されました。

オラクルでブロブサイズを見つけるためのdbms_lob.getlength()とlength()

お役に立てれば....

于 2013-10-25T14:49:43.557 に答える