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

Bagaimana cara melihat tipe variabel dalam PL/SQL secara dinamis?

Anda tidak dapat menguji jenis berdasarkan spesifikasi fungsi tetapi Anda dapat menguji jenis objek yang diteruskan menggunakan IS OF( type ) atau SYS_TYPEID fungsi :

SQL Fiddle

Pengaturan Skema Oracle 11g R2 :

CREATE type my_weird_type IS OBJECT
(
  a NUMBER
) NOT FINAL
/

CREATE TYPE my_weird_subtype UNDER my_weird_type
(
   b NUMBER
)
/

CREATE FUNCTION getType(
  i_type my_weird_type
) RETURN VARCHAR2
IS
BEGIN
  IF i_type IS OF( my_weird_subtype ) THEN
    RETURN 'subtype';
  ELSIF i_type IS OF( my_weird_type ) THEN
    RETURN 'type';
  ELSE
    RETURN 'other';
  END IF;
END;
/

CREATE FUNCTION getType2(
  i_type my_weird_type
) RETURN VARCHAR2
IS
  o_type USER_TYPES.TYPE_NAME%TYPE;
BEGIN
  SELECT type_name
  INTO   o_type
  FROM   user_types
  WHERE  typeid = SYS_TYPEID( i_type );

  RETURN o_type;
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    RETURN NULL;
END;
/

create table test_my_weird_type(
  value my_weird_type
)
/

INSERT INTO test_my_weird_type (value)
SELECT my_weird_type(1)      FROM DUAL UNION ALL
SELECT my_weird_subtype(2,3) FROM DUAL UNION ALL
SELECT NULL                  FROM DUAL
/

Kueri 1 :

SELECT t.value.a AS a,
       TREAT( t.value AS my_weird_subtype ).b AS b,
       getType( value ),
       getType2( value )
FROM   test_my_weird_type t

Hasil :

|      A |      B | GETTYPE(VALUE) |  GETTYPE2(VALUE) |
|--------|--------|----------------|------------------|
|      1 | (null) |           type |    MY_WEIRD_TYPE |
|      2 |      3 |        subtype | MY_WEIRD_SUBTYPE |
| (null) | (null) |          other |           (null) |


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ada Dalam Detailnya

  2. Nilai Data Seiring Waktu

  3. Memigrasikan Oracle Database dari AWS EC2 ke AWS RDS, Bagian 3

  4. Oracle Bagaimana cara memberikan CREATE ANY DIRECTORY dengan batasan bahwa semua direktori harus dibuat di dalam direktori yang diberikan?

  5. Cara Menghapus Nol ketika Bagian Integer adalah Nol di Oracle