Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Dapatkan daftar argumen dengan nilai default

Anda mungkin perlu menggunakan pemrograman plsql dalam 10g, seperti contoh kode di bawah ini. solusi ini tentu saja brute-force dalam beberapa hal, karena pada dasarnya Anda menulis bagian dari parser deklarasi fungsi/prosedur menggunakan primitif tingkat sangat rendah. namun, fungsi ekspresi reguler juga tidak tersedia dalam 10g ...

inti dari kode ini adalah:

  • mengulangi baris kode sumber dari deklarasi prosedur/fungsi
  • perhatikan nama rutin yang paling baru diumumkan
  • analisis semua baris yang mengandung kata kunci 'DEFAULT', dapatkan nama argumen dan spesifikasi nilai default (ini tidak dijelaskan secara rinci dalam contoh kode).

waspadalah terhadap jebakan:

  • deklarasi multibaris
  • Komentar gaya-C berisi string pembuka komentar gaya-C( a la /* bla bla / bla bla **/ )
  • literal string yang berisi kata kunci

semoga membantu, salam.

kode:

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. Terapkan OFFSET dan LIMIT di ORACLE untuk Query Gabung yang kompleks?

  2. Oracle:menentukan nilai default untuk kolom tipe objek

  3. Bagaimana cara memformat kolom NUMBER di Oracle?

  4. Jalankan Segera gagal bahkan dengan hibah tabel CREATE

  5. Oracle mengekspor SQL dari struktur Database