Introduction
In APEX applications, you might need to send large amounts of data through AJAX calls - like Base64 images, large JSON payloads, or document content. However, APEX has a 32K character limit for individual parameters, which can cause errors when dealing with large data.
Problem
APEX limits individual parameters to 32,767 characters in AJAX calls. When you exceed this limit, you'll get errors like ORA-06502: PL/SQL: numeric or value error or data gets truncated silently.
Solution
There are two approaches to handle large data in APEX AJAX calls:
Method 1: Using p_clob_01 (Recent Versions)
For newer APEX versions, you can use the p_clob_01 parameter which handles large data automatically:
Javascript
function generateRandomString(length) {
var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
var result = '';
for (var i = 0; i < length; i++) {
result += chars.charAt(Math.floor(Math.random() * chars.length));
}
return result;
}
var myArrayOfObjects = [];
for (var i = 0; i < 100; i++) {
myArrayOfObjects.push({
id: i,
data: generateRandomString(500),
timestamp: new Date().toISOString()
});
}
var myLargeJsonData = JSON.stringify(myArrayOfObjects);
console.log('Generated JSON size:', myLargeJsonData.length, 'characters');
apex.server.process(
'SAVE_LARGE_DATA',
{
p_clob_01: myLargeJsonData,
x01: 'text'
},
{
success: function (pData) {
console.log('Success! Data sent successfully:', pData);
apex.message.showPageSuccess('Large data processed successfully');
},
error: function (jqXHR, textStatus, errorThrown) {
console.error('Error sending large data:');
console.error('Status:', textStatus);
console.error('Error:', errorThrown);
console.error('Response Text:', jqXHR.responseText);
console.error('Status Code:', jqXHR.status);
apex.message.showErrors([
{
type: "error",
location: "page",
message: "Failed to process large data" + textStatus,
unsafe: false
}
]);
},
dataType: "text"
}
);
AJAX Callback
DECLARE
l_clob_data CLOB := APEX_APPLICATION.G_CLOB_01;
BEGIN
htp.p('{ "charCount" : '||length(l_clob_data)||'}');
END;
Method 2: Data Chunking (All APEX Versions)
Break large data into smaller chunks and send via array parameters:
Javascript
function generateRandomString(length) {
var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
var result = '';
for (var i = 0; i < length; i++) {
result += chars.charAt(Math.floor(Math.random() * chars.length));
}
return result;
}
var myArrayOfObjects = [];
for (var i = 0; i < 100; i++) {
myArrayOfObjects.push({
id: i,
data: generateRandomString(500),
timestamp: new Date().toISOString()
});
}
var myLargeJsonData = JSON.stringify(myArrayOfObjects);
console.log('Generated JSON size:', myLargeJsonData.length, 'characters');
const chunkSize = 8000;
const chunks = [];
for (let i = 0; i < myLargeJsonData.length; i += chunkSize) {
chunks.push(myLargeJsonData.substring(i, i + chunkSize));
}
apex.server.process(
'SAVE_CHUNKED_DATA',
{
f01: chunks,
x01: 'additional_data'
},
{
dataType: 'json',
success: function(pData) {
console.log("Success! Data reassembled on the server.", pData);
apex.message.showPageSuccess('Large data processed successfully');
},
error: function(jqXHR, textStatus, errorThrown) {
console.error("AJAX call failed.");
apex.message.showErrors([
{
type: "error",
location: "page",
message: "Failed to process large data" + textStatus,
unsafe: false
}
]);
}
}
);
AJAX Callback
DECLARE
l_base64_chunks apex_application_global.vc_arr2 := apex_application.g_f01;
l_full_base64 CLOB;
l_result VARCHAR2(255);
BEGIN
l_full_base64 := '';
FOR i IN 1 .. l_base64_chunks.COUNT LOOP
l_full_base64 := l_full_base64 || l_base64_chunks(i);
END LOOP;
htp.p('{ "charCount" : '||length(l_full_base64)||'}');
EXCEPTION
WHEN OTHERS THEN
htp.p('{"error": true, "message": "' || sqlerrm || '"}');
END;
Conclusion
Both methods solve the 32K limit issue. Use p_clob_01 for newer APEX versions or chunking for older versions and maximum compatibility.