我正在尝试在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中完成它?顺便说一句,我试图不使用过程或函数,因为它是最初的要求之一。但是,我认为这可能是唯一的方法。
答案 0 :(得分:0)
如果你不知道要取的表是什么,那么不幸的是你是一个糟糕设计的受害者。为了在SQL中执行它,您必须知道表名,即它必须是静态的并且不能是动态的。
因此,您只剩下一个选项动态SQL 。而且您只能使用PL/SQL
在EXECUTE 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>