Trong Oracle APEX, cách phổ biến nhất để tạo page item là vào Page Designer,
chọn region, rồi tạo từng item như Text Field, Select List, Date Picker, Display Only...
Cách này trực quan, dễ kiểm soát và phù hợp với phần lớn ứng dụng.
Tuy nhiên, trong một số tình huống đặc biệt, bạn có thể muốn tạo page item bằng PL/SQL.
Ví dụ: cần tạo nhiều item theo cấu hình metadata, cần dựng nhanh form mẫu, cần sinh item cho
prototype, hoặc muốn tự động hóa một phần quá trình build ứng dụng.
Bài viết này tập trung vào cách tạo Page Items động trong Oracle APEX bằng PL/SQL,
khi nào nên dùng kỹ thuật này, khi nào không nên dùng và các lưu ý quan trọng về maintainability,
bảo mật, source control và triển khai ứng dụng thực tế.
Tạo Page Items động nghĩa là gì?
“Tạo Page Items động” trong ngữ cảnh này không đơn giản là show/hide item khi runtime.
Ý nghĩa ở đây là dùng PL/SQL để tạo metadata của item trong ứng dụng APEX,
tức là item thực sự xuất hiện trong Page Designer sau khi script chạy.
Nói cách khác, thay vì bạn click chuột tạo item thủ công, bạn viết một đoạn PL/SQL để gọi API/procedure
tạo item cho một page cụ thể, trong một region cụ thể, với tên item, label, type, sequence và các thuộc tính cần thiết.
Cách này khác với việc dùng APEX_ITEM trong SQL report. APEX_ITEM thường tạo form element
trong kết quả query ở runtime. Còn tạo Page Item bằng API là tạo metadata item trong ứng dụng APEX.
Khi nào nên nghĩ đến cách này?
Bạn không nên dùng kỹ thuật này cho mọi page. Với các form thông thường, tạo item bằng Page Designer vẫn là cách tốt nhất.
Tạo item bằng PL/SQL phù hợp hơn với các trường hợp sau:
- Cần tạo nhiều item có cấu trúc giống nhau.
- Cần sinh form dựa trên metadata cấu hình.
- Cần tạo nhanh prototype cho nhiều field.
- Cần tự động hóa việc build page trong môi trường dev.
- Cần tạo dashboard hoặc page cấu hình có nhiều input tương tự nhau.
- Cần chuẩn hóa item naming, label, sequence theo quy tắc chung.
Nếu chỉ cần thêm một vài item đơn giản, thao tác thủ công trong Page Designer thường nhanh hơn,
rõ ràng hơn và ít rủi ro hơn.
Ý tưởng tổng quát của script tạo item
Một script tạo item thường cần biết các thông tin sau:
- Application ID.
- Page ID.
- Region ID nơi item sẽ được đặt.
- Tên item, ví dụ
P10_CUSTOMER_NAME.
- Label hiển thị.
- Loại item, ví dụ Text Field, Number Field, Select List.
- Sequence để xác định thứ tự hiển thị.
- Các thuộc tính bổ sung như required, source, format mask, LOV...
Về mặt tư duy, bạn đang biến thao tác cấu hình trong Page Designer thành một script có thể chạy lại.
Điều này hữu ích khi bạn muốn lặp lại cùng một pattern cho nhiều page hoặc nhiều item.
Ví dụ minh họa tạo item bằng PL/SQL
Tùy phiên bản APEX và API bạn sử dụng, tên procedure/tham số có thể khác nhau.
Ý tưởng thường giống như sau: xác định page, region, rồi gọi procedure tạo item.
begin
create_page_item(
p_application_id => 100,
p_page_id => 10,
p_region_id => 123456789,
p_item_name => 'P10_CUSTOMER_NAME',
p_item_label => 'Customer Name',
p_item_type => 'NATIVE_TEXT_FIELD',
p_sequence => 10
);
commit;
end;
Đây là ví dụ minh họa theo tinh thần của bài gốc. Khi áp dụng trong môi trường thật,
bạn cần kiểm tra đúng procedure/API, workspace, application id, page id và region id của ứng dụng bạn.
Nếu script chạy thành công, item sẽ được tạo trong metadata của page. Bạn có thể mở lại Page Designer
để kiểm tra item mới đã xuất hiện hay chưa.
Cách lấy Application ID, Page ID và Region ID
Application ID và Page ID thường rất dễ thấy trong App Builder.
Ví dụ URL Page Designer thường có app id và page id trong đường dẫn hoặc trong breadcrumb.
Region ID thì bạn có thể lấy bằng cách query metadata view của APEX.
Ví dụ:
select application_id,
page_id,
region_id,
region_name
from apex_application_page_regions
where application_id = :APP_ID
and page_id = 10
order by display_sequence;
Khi đã có region id, script tạo item có thể đặt item vào đúng region mong muốn.
Tạo nhiều item từ bảng metadata
Điểm mạnh của kỹ thuật này là có thể tạo nhiều item từ một bảng cấu hình.
Ví dụ bạn có bảng metadata như sau:
create table form_item_config (
id number generated always as identity primary key,
page_id number not null,
region_name varchar2(200),
item_name varchar2(100) not null,
item_label varchar2(200) not null,
item_type varchar2(100) not null,
display_seq number not null,
is_required varchar2(1) default 'N'
);
Sau đó bạn có thể viết một script loop qua bảng này và tạo item tương ứng.
begin
for r in (
select *
from form_item_config
where page_id = 10
order by display_seq
) loop
create_page_item(
p_application_id => 100,
p_page_id => r.page_id,
p_region_id => 123456789,
p_item_name => r.item_name,
p_item_label => r.item_label,
p_item_type => r.item_type,
p_sequence => r.display_seq
);
end loop;
commit;
end;
Cách này phù hợp khi bạn cần dựng nhanh nhiều field theo cấu hình,
ví dụ một form khảo sát, form đăng ký, form nhập liệu động hoặc page prototype.
Ứng dụng thực tế
Tạo Page Items bằng PL/SQL có thể hữu ích trong nhiều tình huống:
- Dynamic Forms: tạo form dựa trên yêu cầu hoặc vai trò người dùng.
- Custom Dashboards: thêm input hoặc filter theo cấu hình.
- Rapid Prototyping: tạo nhanh nhiều field để demo ý tưởng.
- Standardized Pages: sinh các item theo naming convention chung.
- Metadata-driven Apps: dùng bảng cấu hình để sinh UI ban đầu.
Tuy nhiên, cần nhớ rằng việc tạo metadata động không nên biến ứng dụng thành một thứ khó kiểm soát.
Mỗi item được tạo ra vẫn cần được review, test và quản lý như item tạo thủ công.
Các lưu ý quan trọng trước khi dùng
Kỹ thuật này mạnh, nhưng cũng có một số rủi ro:
- Script có thể tạo trùng item nếu không kiểm tra trước.
- Item được tạo ra có thể thiếu thuộc tính cần thiết như session state protection, validations hoặc source.
- Khó review thay đổi nếu không lưu script trong source control.
- Không nên chạy tùy tiện trên production.
- Cần kiểm tra tương thích theo phiên bản APEX.
Vì vậy, trước khi tạo item, bạn nên kiểm tra item đã tồn tại chưa.
select count(*)
from apex_application_page_items
where application_id = 100
and page_id = 10
and item_name = 'P10_CUSTOMER_NAME';
Nếu count lớn hơn 0 thì không nên tạo lại item cùng tên.
Không nên lạm dụng để thay thế Page Designer
Page Designer vẫn là công cụ chính để thiết kế UI trong Oracle APEX.
Tạo item bằng PL/SQL chỉ nên dùng khi bạn có lý do rõ ràng: tự động hóa, tạo hàng loạt,
prototype hoặc metadata-driven setup.
Nếu một page chỉ có vài item quan trọng, việc tạo thủ công sẽ dễ hiểu hơn.
Developer khác mở Page Designer cũng dễ nắm được cấu trúc page hơn.
Ngược lại, nếu bạn phải tạo 50 item theo cùng một quy tắc, script có thể tiết kiệm rất nhiều thời gian
và giảm lỗi thao tác thủ công.
So sánh với cách render item động ở runtime
Có một điểm rất dễ nhầm: tạo Page Item bằng metadata API khác với render input động ở runtime.
- Tạo Page Item bằng PL/SQL: item được tạo trong metadata của app và thấy trong Page Designer.
- APEX_ITEM hoặc HTML động: input được render khi page chạy, nhưng không phải page item thật trong Page Designer.
Nếu bạn cần form linh hoạt như khảo sát, có thể dùng metadata + custom table để lưu câu hỏi/câu trả lời.
Không phải lúc nào cũng cần tạo Page Item thật cho từng câu hỏi. Đôi khi dùng report + APEX_ITEM hoặc custom HTML
lại phù hợp hơn.
Best practice khi tạo item bằng script
Nếu dùng cách này trong dự án thật, bạn nên áp dụng một số nguyên tắc:
- Luôn lưu script tạo item vào source control.
- Kiểm tra item đã tồn tại trước khi tạo.
- Dùng naming convention rõ ràng như
P10_....
- Không hard-code quá nhiều nếu có thể lấy từ metadata.
- Chạy thử trong môi trường dev trước.
- Review item trong Page Designer sau khi tạo.
- Bổ sung validation, authorization và session state protection nếu cần.
- Ghi chú rõ script phục vụ mục đích gì.
Kết luận
Tạo Page Items động trong Oracle APEX bằng PL/SQL là một kỹ thuật nâng cao,
hữu ích khi bạn cần tự động hóa, tạo hàng loạt hoặc xây dựng ứng dụng theo metadata.
Tuy nhiên, kỹ thuật này không nên thay thế Page Designer trong các tình huống thông thường.
Hãy dùng nó khi có nhu cầu rõ ràng, lưu script cẩn thận, kiểm tra trùng item,
và luôn review lại kết quả trong APEX.
Khi dùng đúng chỗ, việc tạo item bằng PL/SQL có thể giúp bạn tiết kiệm thời gian,
chuẩn hóa cấu trúc page và tăng tốc quá trình phát triển ứng dụng Oracle APEX.