bạn có thể cần phải sử dụng đến lập trình plsql trong 10g, trong mạch của mẫu mã bên dưới. giải pháp này chắc chắn là brute-force theo nghĩa nào đó, vì về cơ bản bạn viết một phần của trình phân tích cú pháp khai báo hàm / thủ tục bằng cách sử dụng các nguyên thủy cấp thấp. tuy nhiên, các hàm biểu thức chính quy cũng không khả dụng trong 10g ...
ý chính của mã là:
- lặp lại các dòng mã nguồn của các khai báo thủ tục / hàm
- ghi lại tên của quy trình được khai báo gần đây nhất
- phân tích tất cả các dòng có chứa từ khóa 'DEFAULT', lấy tên đối số và thông số giá trị mặc định (điều này không được trình bày chi tiết trong mẫu mã).
cẩn thận với cạm bẫy:
- khai báo nhiều dòng
- Nhận xét kiểu C chứa chuỗi mở đầu nhận xét kiểu C (a la / * blah blah / blah blah ** /)
- chuỗi ký tự chứa từ khóa
hy vọng điều đó dù sao cũng giúp ích cho bạn, trân trọng.
mã:
DECLARE
l_arg_and_more VARCHAR2(400);
l_current_unit VARCHAR2(400);
l_default_spec VARCHAR2(400);
l_offset_default BINARY_INTEGER;
l_offset_eoname BINARY_INTEGER;
BEGIN
FOR i IN (
select text
from all_source
where owner = '<name of owner>'
and name = '<object name>'
and type in ( 'PACKAGE', 'PROCEDURE', 'FUNCTION')
and text not like '--%'
order by line
) LOOP
IF i.text LIKE '%FUNCTION%' OR i.text LIKE '%PROCEDURE%' THEN
IF i.text LIKE '%FUNCTION%' THEN
l_current_unit := LTRIM(SUBSTR(i.text, INSTR(i.text, 'FUNCTION') + LENGTH('FUNCTION')), ' ');
l_offset_eoname := INSTR(l_current_unit, ' ');
IF l_offset_eoname = 0 OR l_offset_eoname > INSTR(l_current_unit, '(') THEN
l_offset_eoname := INSTR(l_current_unit, '(');
END IF;
IF l_offset_eoname <> 0 THEN
l_current_unit := SUBSTR(l_current_unit, 1, l_offset_eoname-1);
ELSE
l_current_unit := 'unidentified';
END IF;
END IF;
END IF;
--
IF i.text LIKE '%DEFAULT%' THEN
l_offset_default := INSTR (i.text, 'DEFAULT');
l_arg_and_more := SUBSTR(i.text, 1, l_offset_default - 1);
l_default_spec := SUBSTR(i.text, l_offset_default + LENGTH('DEFAULT') + 1);
--
-- process l_arg_and_more to get the arg name, l_default_spec for the default value
--
END IF;
END LOOP;
END;