Oracle,执行字符串作为查询并返回结果集

时间:2015-02-20 14:07:35

标签: oracle11g

我正在尝试在oracle中创建一个字符串查询然后执行它。我知道我可以使用execute immediate执行此操作,但是我没有得到结果集。据我所知,我可以使用光标逐个检索行,但这似乎并没有完成这项工作(我认为游标只是引用而不是结果集,或者我的知识可能非常有限但无论如何)。为了更清楚,我想通过BIRT报告工具执行此字符串查询,它总是给我一个错误消息" SQL语句不返回ResultSet对象"。

概念如下:

1。我的 tableA 有一些名字。比如Nike,Adidas ......我不知道那些表是哪个。(必须是动态的)

2。对于每张表,还有其他表格,例如Nike。商店,Adidas。商店。 不好的是,高级表与低级表没有关联。例如,Nike表与Nike没有任何关系。商店表(不幸的是这就是设计数据库的方式..)。

3. 所以在MS SQL中我创建了一个字符串,如:

SELECT @SqlStr = @SqlStr + N'SELECT * FROM ' + names + N'.stores 
UNION ALL '  FROM **tableA** Group by names

实际上会执行如下:

Select * from Nike.stores UNION ALL Select * from Adidas.stores ... 

这样可以正常工作,因为它返回结果集。

我的问题是如何在oracle中完成它?顺便说一句,我试图不使用过程或函数,因为它是最初的要求之一。但是,我认为这可能是唯一的方法。

1 个答案:

答案 0 :(得分:0)

如果你不知道要取的表是什么,那么不幸的是你是一个糟糕设计的受害者。为了在SQL中执行它,您必须知道表名,即它必须是静态的并且不能是动态的。

因此,您只剩下一个选项动态SQL 。而且您只能使用PL/SQLEXECUTE IMMEDIATE中执行此操作。

UPDATE 要返回refcursor,请在动态SQL中使用OPEN FOR。

只是一个例子,

SQL> variable cur refcursor
SQL> DECLARE
  2    tab_name VARCHAR2(10);
  3    str_sql  VARCHAR2(200);
  4  BEGIN
  5    tab_name :='EMP';
  6    str_sql  :='SELECT empno, ename FROM '||tab_name;
  7    OPEN :cur FOR str_sql;
  8  END;
  9  /

PL/SQL procedure successfully completed.

SQL> print cur

     EMPNO ENAME
---------- ----------
      7369 SMITH
      7499 ALLEN
      7521 WARD
      7566 JONES
      7654 MARTIN
      7698 BLAKE
      7782 CLARK
      7788 SCOTT
      7839 KING
      7844 TURNER
      7876 ADAMS

     EMPNO ENAME
---------- ----------
      7900 JAMES
      7902 FORD
      7934 MILLER

14 rows selected.

SQL>