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

但是请记住:

  1. 如果不给列起别名,结果集的列名将是第一个查询的列名

  2. 如果您的列具有混合数据类型 (CHAR/NUMBER/..),您最终会遇到以下错误:

ORA-01790: expression must have same datatype as corresponding expression

要避免这种情况,请将您的数字列(如果有)转换为 CHAR

  1. 最好添加一个列来定义 table 记录的来源,因为在使用 API
  2. 的程序中可能需要它

因此你应该得到这样的结果:

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