Oracle - 返回多个表

时间:2016-07-29 11:06:26

标签: oracle function cursor

我从

中选择了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函数。我需要使用单一返回返回所有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;

1 个答案:

答案 0 :(得分:1)

根据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 / ..),则最终会出现以下错误:

  3.   

    ORA-01790:表达式必须与对应的数据类型相同   表达

    绕过这个,将你的数字列(如果有的话)转换成CHAR

    1. 最好添加一个列来定义记录来自哪个表,因为在使用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