Oracle兼容-语法-TABLE FUNCTION
1. 语法
1. SET sql_mode = ORACLE;
3. TABLE(expr_list)
5. expr_list:
6. expr, type_table_name(type_name(expr, expr..), type_name(expr, expr..) ..)
需要先切换到 ORACLE 模式下才能支持本语法。
2. 定义和用法
GreatSQL支持用TABLE函数获取自定义表类型数据的用法。
3. 示例
-
- 示例1:
SELECT FROM TABLE()
- 示例1:
1. -- 先切换到ORACLE模式
2. greatsql> SET sql_mode = ORACLE;
4. greatsql> CREATE OR REPLACE TYPE ud_type1 AS OBJECT(id INT, c1 VARCHAR(10));
5. greatsql> CREATE OR REPLACE TYPE ud_tbl1 AS TABLE OF greatsql.ud_type1;
6. greatsql> CREATE OR REPLACE TYPE ud_varray1 AS VARRAY(10) OF ud_type1;
8. greatsql> SELECT * FROM TABLE(ud_tbl1(ud_type1(1, 'c1_rowa'), ud_type1(2, 'c1_rowb')));
9. +------+---------+
10. | id | c1 |
11. +------+---------+
12. | 1 | c1_rowa |
13. | 2 | c1_rowb |
14. +------+---------+
15. 2 rows in set (0.00 sec)
17. greatsql> SELECT * FROM TABLE(ud_tbl1(ud_type1(1, 'c1_rowa'), ud_type1(2, 'c1_rowb'))) a,
18. TABLE(ud_varray1(ud_type1(1, 'c1_rowa'), ud_type1(2, 'c1_rowb'))) b;
19. +------+---------+------+---------+
20. | id | c1 | id | c1 |
21. +------+---------+------+---------+
22. | 1 | c1_rowa | 1 | c1_rowa |
23. | 1 | c1_rowa | 2 | c1_rowb |
24. | 2 | c1_rowb | 1 | c1_rowa |
25. | 2 | c1_rowb | 2 | c1_rowb |
26. +------+---------+------+---------+
27. 4 rows in set (0.00 sec)
29. greatsql> CREATE TABLE ud_tbl2(id INT, c1 ud_type1);
30. greatsql> INSERT INTO ud_tbl2 VALUES(10, ud_type1(10, 'c1_rowa10')), (11, ud_type1(11, 'c1_rowb11'));
32. greatsql> SELECT a.id, a.c1 FROM ud_tbl2 b,
33. TABLE(ud_tbl1(b.c1, ud_type1(1, 'c1_rowa'))) a;
34. +------+-----------+
35. | id | c1 |
36. +------+-----------+
37. | 10 | c1_rowa10 |
38. | 1 | c1_rowa |
39. | 11 | c1_rowb11 |
40. | 1 | c1_rowa |
41. +------+-----------+
42. 4 rows in set (0.00 sec)
-
- 示例2:
CREATE TABLE AS ... SELECT FROM TABLE()
- 示例2:
1. 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;
6. greatsql> CREATE TABLE ud_tbl2 AS SELECT * FROM TABLE(ud_tbl1(ud_type1(1, 'c1_rowa'), ud_type1(2, 'c1_rowb')));
7. Query OK, 2 rows affected (0.00 sec)
8. 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. +------+---------+
17. 2 rows in set (0.00 sec)
-
- 示例3:
INSERT INTO ... SELECT FROM TABLE()
- 示例3:
1. 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 TABLE ud_tbl2 AS SELECT * FROM TABLE(ud_tbl1(ud_type1(1, 'c1_rowa'), ud_type1(2, 'c1_rowb')));
6. Query OK, 2 rows affected (0.02 sec)
7. Records: 2 Duplicates: 0 Warnings: 0
9. greatsql> INSERT INTO ud_tbl2 SELECT * FROM TABLE(ud_tbl1(ud_type1(3, 'c1_rowc'), ud_type1(4, 'c1_rowd')));
10. Query OK, 2 rows affected (0.00 sec)
11. Records: 2 Duplicates: 0 Warnings: 0
13. greatsql> SELECT * FROM ud_tbl2;
14. +------+---------+
15. | id | c1 |
16. +------+---------+
17. | 1 | c1_rowa |
18. | 2 | c1_rowb |
19. | 3 | c1_rowc |
20. | 4 | c1_rowd |
21. +------+---------+
22. 4 rows in set (0.00 sec)
-
- 示例4:
SELECT FROM TABLE() WHERE
- 示例4:
1. 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;
6. greatsql> SELECT * FROM TABLE(ud_tbl1(ud_type1(1, 'c1_rowa'), ud_type1(2, 'c1_rowb'))) WHERE id>1;
7. +------+---------+
8. | id | c1 |
9. +------+---------+
10. | 2 | c1_rowb |
11. +------+---------+
12. 1 row in set (0.00 sec)
14. greatsql> SELECT * FROM TABLE(ud_tbl1(ud_type1(1, 'c1_rowa'), ud_type1(2, 'c1_rowb')));
15. +------+---------+
16. | id | c1 |
17. +------+---------+
18. | 1 | c1_rowa |
19. | 2 | c1_rowb |
20. +------+---------+
21. 2 rows in set (0.00 sec)
23. greatsql> CREATE OR REPLACE TYPE my_int IS VARRAY(100) OF INTEGER;
24. Query OK, 0 rows affected (0.00 sec)
26. greatsql> SELECT * FROM TABLE(my_int('1', 0, NULL));
27. +--------------+
28. | column_value |
29. +--------------+
30. | 1 |
31. | 0 |
32. | NULL |
33. +--------------+
34. 3 rows in set (0.00 sec)
-
- 示例5:
EXPLAIN SELECT FROM TABLE()
- 示例5:
1. 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_varray1 AS VARRAY(10) OF ud_type1;
6. greatsql> EXPLAIN SELECT * FROM TABLE(ud_varray1(ud_type1(1, 'c1_rowa'), ud_type1(2, 'c1_rowb')))\G
7. *************************** 1. row ***************************
8. id: 1
9. select_type: SIMPLE
10. table: udt_table_-5015528632416731088
11. partitions: NULL
12. type: ALL
13. possible_keys: NULL
14. key: NULL
15. key_len: NULL
16. ref: NULL
17. rows: 2
18. filtered: 100.00
19. Extra: Table function: udt_table; Using temporary
21. greatsql> SHOW WARNINGS\G
22. *************************** 1. row ***************************
23. Level: Note
24. Code: 1003
25. 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
问题反馈
联系我们
扫码关注微信公众号

