Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Nhận danh sách các đối số với giá trị mặc định

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;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nhà tiên tri. Ngăn hợp nhất truy vấn phụ và điều kiện truy vấn chính

  2. vấn đề với apex_application_temp_files

  3. Oracle10g SQL pivot

  4. Loại dữ liệu bản ghi dựa trên con trỏ với con trỏ trả về nhiều giá trị trong cơ sở dữ liệu Oracle

  5. Vòng lặp lồng nhau Tham gia vào Oracle 11g