在 Pro*C 檔案中,我有一個這樣的獲取模式:
EXEC SQL BEGIN DECLARE SECTION;
typedef struct my_row_t
{
unsigned field1;
unsigned field2;
} my_row;
EXEC SQL END DECLARE SECTION;
void do_query()
{
EXEC SQL BEGIN DECLARE SECTION;
struct my_row* buffer;
unsigned buffer_size;
EXEC SQL END DECLARE SECTION;
buffer_size = /* some tied upper bound on the number of rows to fetch */;
buffer = (my_row*)malloc(buffer_size * sizeof(my_row));
// Create my_cursor based on some select query
// ...
// and now:
EXEQ SQL FOR :buffer_size FETCH my_cursor INTO :buffer;
unsigned number_of_fetched_rows = sqlca.sqlerrd[2];
// At this point, with just one fetch I have all the rows
}
問題是,有時,您無法估計合適的上限。我說的是不會回傳超過幾千行的查詢,但我不想為例如 5000 行分配存盤,因為對特定輸入的特定查詢只會給你 500。
有沒有一種方法可以在不執行任何count(*)查詢(出于性能原因)進行第一次提取之前(例如,剛打開游標之后)以有效的方式知道要提取的行數?
我的目標是盡可能以最高性能的方式在一次傳遞中“獲取全部”。
我認為它可以用 PL/SQL 表/記錄來完成,但我不知道如何使用 Pro*C 語法在我自己的緩沖區中“保存”或提取 PL/SQL 表的內容。
uj5u.com熱心網友回復:
有沒有一種方法可以在第一次獲取之前(例如,在打開游標之后)以有效的方式知道要獲取的行數,而不執行任何 count(*) 查詢(出于性能原因)?
不幸的是,沒有。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/388831.html
