Oracle兼容-语法-TABLE FUNCTION


1. 语法

  1. SET sql_mode = ORACLE;
  2. TABLE(expr_list)
  3. expr_list:
  4. expr, type_table_name(type_name(expr, expr..), type_name(expr, expr..) ..)

需要先切换到 ORACLE 模式下才能支持本语法。

2. 定义和用法

GreatSQL支持用TABLE函数获取自定义表类型数据的用法。

3. 示例

    1. 示例1:SELECT FROM TABLE()
  1. -- 先切换到ORACLE模式
  2. greatsql> SET sql_mode = ORACLE;
  3. greatsql> CREATE OR REPLACE TYPE ud_type1 AS OBJECT(id INT, c1 VARCHAR(10));
  4. greatsql> CREATE OR REPLACE TYPE ud_tbl1 AS TABLE OF greatsql.ud_type1;
  5. greatsql> CREATE OR REPLACE TYPE ud_varray1 AS VARRAY(10) OF ud_type1;
  6. greatsql> SELECT * FROM TABLE(ud_tbl1(ud_type1(1, 'c1_rowa'), ud_type1(2, 'c1_rowb')));
  7. +------+---------+
  8. | id | c1 |
  9. +------+---------+
  10. | 1 | c1_rowa |
  11. | 2 | c1_rowb |
  12. +------+---------+
  13. 2 rows in set (0.00 sec)
  14. greatsql> SELECT * FROM TABLE(ud_tbl1(ud_type1(1, 'c1_rowa'), ud_type1(2, 'c1_rowb'))) a,
  15. TABLE(ud_varray1(ud_type1(1, 'c1_rowa'), ud_type1(2, 'c1_rowb'))) b;
  16. +------+---------+------+---------+
  17. | id | c1 | id | c1 |
  18. +------+---------+------+---------+
  19. | 1 | c1_rowa | 1 | c1_rowa |
  20. | 1 | c1_rowa | 2 | c1_rowb |
  21. | 2 | c1_rowb | 1 | c1_rowa |
  22. | 2 | c1_rowb | 2 | c1_rowb |
  23. +------+---------+------+---------+
  24. 4 rows in set (0.00 sec)
  25. greatsql> CREATE TABLE ud_tbl2(id INT, c1 ud_type1);
  26. greatsql> INSERT INTO ud_tbl2 VALUES(10, ud_type1(10, 'c1_rowa10')), (11, ud_type1(11, 'c1_rowb11'));
  27. greatsql> SELECT a.id, a.c1 FROM ud_tbl2 b,
  28. TABLE(ud_tbl1(b.c1, ud_type1(1, 'c1_rowa'))) a;
  29. +------+-----------+
  30. | id | c1 |
  31. +------+-----------+
  32. | 10 | c1_rowa10 |
  33. | 1 | c1_rowa |
  34. | 11 | c1_rowb11 |
  35. | 1 | c1_rowa |
  36. +------+-----------+
  37. 4 rows in set (0.00 sec)
    1. 示例2:CREATE TABLE AS ... SELECT FROM TABLE()
  1. greatsql> SET sql_mode = ORACLE;
  2. greatsql> CREATE OR REPLACE TYPE ud_type1 AS OBJECT(id INT, c1 VARCHAR(10));
  3. greatsql> CREATE OR REPLACE TYPE ud_tbl1 AS TABLE OF greatsql.ud_type1;
  4. greatsql> CREATE TABLE ud_tbl2 AS SELECT * FROM TABLE(ud_tbl1(ud_type1(1, 'c1_rowa'), ud_type1(2, 'c1_rowb')));
  5. Query OK, 2 rows affected (0.00 sec)
  6. Records: 2 Duplicates: 0 Warnings: 0
  7. greatsql> SELECT * FROM ud_tbl2;
  8. +------+---------+
  9. | id | c1 |
  10. +------+---------+
  11. | 1 | c1_rowa |
  12. | 2 | c1_rowb |
  13. +------+---------+
  14. 2 rows in set (0.00 sec)
    1. 示例3:INSERT INTO ... SELECT FROM TABLE()
  1. greatsql> SET sql_mode = ORACLE;
  2. greatsql> CREATE OR REPLACE TYPE ud_type1 AS OBJECT(id INT, c1 VARCHAR(10));
  3. greatsql> CREATE OR REPLACE TYPE ud_tbl1 AS TABLE OF greatsql.ud_type1;
  4. greatsql> CREATE TABLE ud_tbl2 AS SELECT * FROM TABLE(ud_tbl1(ud_type1(1, 'c1_rowa'), ud_type1(2, 'c1_rowb')));
  5. Query OK, 2 rows affected (0.02 sec)
  6. Records: 2 Duplicates: 0 Warnings: 0
  7. greatsql> INSERT INTO ud_tbl2 SELECT * FROM TABLE(ud_tbl1(ud_type1(3, 'c1_rowc'), ud_type1(4, 'c1_rowd')));
  8. Query OK, 2 rows affected (0.00 sec)
  9. Records: 2 Duplicates: 0 Warnings: 0
  10. greatsql> SELECT * FROM ud_tbl2;
  11. +------+---------+
  12. | id | c1 |
  13. +------+---------+
  14. | 1 | c1_rowa |
  15. | 2 | c1_rowb |
  16. | 3 | c1_rowc |
  17. | 4 | c1_rowd |
  18. +------+---------+
  19. 4 rows in set (0.00 sec)
    1. 示例4:SELECT FROM TABLE() WHERE
  1. greatsql> SET sql_mode = ORACLE;
  2. greatsql> CREATE OR REPLACE TYPE ud_type1 AS OBJECT(id INT, c1 VARCHAR(10));
  3. greatsql> CREATE OR REPLACE TYPE ud_tbl1 AS TABLE OF greatsql.ud_type1;
  4. greatsql> SELECT * FROM TABLE(ud_tbl1(ud_type1(1, 'c1_rowa'), ud_type1(2, 'c1_rowb'))) WHERE id>1;
  5. +------+---------+
  6. | id | c1 |
  7. +------+---------+
  8. | 2 | c1_rowb |
  9. +------+---------+
  10. 1 row in set (0.00 sec)
  11. greatsql> SELECT * FROM TABLE(ud_tbl1(ud_type1(1, 'c1_rowa'), ud_type1(2, 'c1_rowb')));
  12. +------+---------+
  13. | id | c1 |
  14. +------+---------+
  15. | 1 | c1_rowa |
  16. | 2 | c1_rowb |
  17. +------+---------+
  18. 2 rows in set (0.00 sec)
  19. greatsql> CREATE OR REPLACE TYPE my_int IS VARRAY(100) OF INTEGER;
  20. Query OK, 0 rows affected (0.00 sec)
  21. greatsql> SELECT * FROM TABLE(my_int('1', 0, NULL));
  22. +--------------+
  23. | column_value |
  24. +--------------+
  25. | 1 |
  26. | 0 |
  27. | NULL |
  28. +--------------+
  29. 3 rows in set (0.00 sec)
    1. 示例5:EXPLAIN SELECT FROM TABLE()
  1. greatsql> SET sql_mode = ORACLE;
  2. greatsql> CREATE OR REPLACE TYPE ud_type1 AS OBJECT(id INT, c1 VARCHAR(10));
  3. greatsql> CREATE OR REPLACE TYPE ud_varray1 AS VARRAY(10) OF ud_type1;
  4. greatsql> EXPLAIN SELECT * FROM TABLE(ud_varray1(ud_type1(1, 'c1_rowa'), ud_type1(2, 'c1_rowb')))\G
  5. *************************** 1. row ***************************
  6. id: 1
  7. select_type: SIMPLE
  8. table: udt_table_-5015528632416731088
  9. partitions: NULL
  10. type: ALL
  11. possible_keys: NULL
  12. key: NULL
  13. key_len: NULL
  14. ref: NULL
  15. rows: 2
  16. filtered: 100.00
  17. Extra: Table function: udt_table; Using temporary
  18. greatsql> SHOW WARNINGS\G
  19. *************************** 1. row ***************************
  20. Level: Note
  21. Code: 1003
  22. Message: /* select#1 */ select "greatsql"."udt_table_-5015528632416731088"."id" AS "id","greatsql"."udt_table_-5015528632416731088"."c1" AS "c1" from table(ud_varray1(ud_type1(1,'c1_rowa'),ud_type1(2,'c1_rowb'))) "udt_table_-5015528632416731088"

4. 导出备份

在使用 mysqldump 导出数据时,可通过指定 --routines 选项(默认为关闭),导出TABLE FUNCTION对象。

示例:

  1. mysqldump -S/data/GreatSQL/mysql.sock -uroot -pxxx -B greatsql -d --routines > /data/backup/GreatSQL/greatsql-ddl.sql

问题反馈

联系我们

扫码关注微信公众号

greatsql-wx