Oracle - return 多个表
Oracle - return multiple tables
我从中选择了 3 个表格
SELECT STUDENT_ID, STUDENT_CLASS FROM STUDENT;
SELECT EMP_NAME, EMP_SKILL FROM EMP;
SELECT PATIENT_NAME, DISEASE FROM PATIENT;
注意:这 3 个表之间没有关系,但我在函数中需要它,所以我可以将它传递给 API。
我有一个函数GET_DATA。我需要 return 使用单个 return 所有 3 个表,这可能吗?
FUNCTION GET_DATA(PARA1 NUMBER DEFAULT 1,PARA2 NUMBER DEFAULT 1)RETURN SYS_REFCURSOR AS
RESULT SYS_REFCURSOR;
BEGIN
OPEN RESULT FOR SELECT STUDENT_ID, STUDENT_CLASS FROM STUDENT;
OPEN RESULT FOR SELECT EMP_NAME, EMP_SKILL FROM EMP;
OPEN RESULT FOR SELECT PATIENT_NAME, DISEASE FROM PATIENT;
RETURN RESULT ;
END GET_DATA;
按照 Gordon 的建议,使用 UNION ALL 是解决方案
SELECT STUDENT_ID, STUDENT_CLASS FROM STUDENT
UNION ALL
SELECT EMP_NAME, EMP_SKILL FROM EMP
UNION ALL
SELECT PATIENT_NAME, DISEASE FROM PATIENT
但是请记住:
如果不给列起别名,结果集的列名将是第一个查询的列名
如果您的列具有混合数据类型 (CHAR/NUMBER/..),您最终会遇到以下错误:
ORA-01790: expression must have same datatype as corresponding
expression
要避免这种情况,请将您的数字列(如果有)转换为 CHAR
- 最好添加一个列来定义 table 记录的来源,因为在使用 API
的程序中可能需要它
因此你应该得到这样的结果:
SELECT 'STUDENT' AS ORIGTABLE, TO_CHAR(STUDENT_ID) As COL1 , STUDENT_CLASS AS COL2 FROM STUDENT
UNION ALL
SELECT 'EMP' AS ORIGTABLE, EMP_NAME AS COL1, EMP_SKILL AS COL2 FROM EMP
UNION ALL
SELECT 'PATIENT' AS ORIGTABLE, PATIENT_NAME AS COL1, DISEASE AS COL2 FROM PATIENT
我从中选择了 3 个表格
SELECT STUDENT_ID, STUDENT_CLASS FROM STUDENT;
SELECT EMP_NAME, EMP_SKILL FROM EMP;
SELECT PATIENT_NAME, DISEASE FROM PATIENT;
注意:这 3 个表之间没有关系,但我在函数中需要它,所以我可以将它传递给 API。
我有一个函数GET_DATA。我需要 return 使用单个 return 所有 3 个表,这可能吗?
FUNCTION GET_DATA(PARA1 NUMBER DEFAULT 1,PARA2 NUMBER DEFAULT 1)RETURN SYS_REFCURSOR AS
RESULT SYS_REFCURSOR;
BEGIN
OPEN RESULT FOR SELECT STUDENT_ID, STUDENT_CLASS FROM STUDENT;
OPEN RESULT FOR SELECT EMP_NAME, EMP_SKILL FROM EMP;
OPEN RESULT FOR SELECT PATIENT_NAME, DISEASE FROM PATIENT;
RETURN RESULT ;
END GET_DATA;
按照 Gordon 的建议,使用 UNION ALL 是解决方案
SELECT STUDENT_ID, STUDENT_CLASS FROM STUDENT
UNION ALL
SELECT EMP_NAME, EMP_SKILL FROM EMP
UNION ALL
SELECT PATIENT_NAME, DISEASE FROM PATIENT
但是请记住:
如果不给列起别名,结果集的列名将是第一个查询的列名
如果您的列具有混合数据类型 (CHAR/NUMBER/..),您最终会遇到以下错误:
ORA-01790: expression must have same datatype as corresponding expression
要避免这种情况,请将您的数字列(如果有)转换为 CHAR
- 最好添加一个列来定义 table 记录的来源,因为在使用 API 的程序中可能需要它
因此你应该得到这样的结果:
SELECT 'STUDENT' AS ORIGTABLE, TO_CHAR(STUDENT_ID) As COL1 , STUDENT_CLASS AS COL2 FROM STUDENT
UNION ALL
SELECT 'EMP' AS ORIGTABLE, EMP_NAME AS COL1, EMP_SKILL AS COL2 FROM EMP
UNION ALL
SELECT 'PATIENT' AS ORIGTABLE, PATIENT_NAME AS COL1, DISEASE AS COL2 FROM PATIENT