Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle11g Oracle,执行字符串作为查询并返回结果集_Oracle11g - Fatal编程技术网

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

Oracle11g Oracle,执行字符串作为查询并返回结果集,oracle11g,Oracle11g,我试图在oracle中创建一个字符串查询,然后执行它。我知道我可以使用executeimmediate来实现这一点,但是我不会得到返回的结果集。据我所知,我可以使用游标一行一行地检索行,但这似乎不起作用。我认为游标只是引用而不是结果集,或者我的知识可能非常有限,但无论如何。更清楚地说,我想通过BIRT报告工具执行这个字符串查询,它总是给我一个错误消息SQL语句不返回ResultSet对象 概念如下: 一,。我有一张有一些名字的表格。例如耐克、阿迪达斯……我不知道这些表格是什么。必须是动态的 二,

我试图在oracle中创建一个字符串查询,然后执行它。我知道我可以使用executeimmediate来实现这一点,但是我不会得到返回的结果集。据我所知,我可以使用游标一行一行地检索行,但这似乎不起作用。我认为游标只是引用而不是结果集,或者我的知识可能非常有限,但无论如何。更清楚地说,我想通过BIRT报告工具执行这个字符串查询,它总是给我一个错误消息SQL语句不返回ResultSet对象

概念如下:

一,。我有一张有一些名字的表格。例如耐克、阿迪达斯……我不知道这些表格是什么。必须是动态的

二,。每个表都有其他表,如Nike.stores、Adidas.stores。 糟糕的是,高级表与低级表没有连接。例如,Nike table与Nike.stores table没有关系。不幸的是,这是数据库的设计方式

三,。因此,在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中实现这一点?顺便说一句,我尽量不使用过程或函数,因为这是最初的需求之一。但是,我认为这可能是唯一的方法。

如果您不知道从哪些表中获取数据,那么很不幸,您是一个糟糕设计的受害者。为了在SQL中实现这一点,您必须知道表名,即表名必须是静态的,不能是动态的

因此,您只剩下一个选项,动态SQL。您只能使用executeimmediate在PL/SQL中执行

UPDATE若要返回refcursor,请将OPEN FOR与动态SQL一起使用

举个例子,

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>

实际上如何从BIRT发出查询调用?如果您不能在toool命令上构建查询,那么您可以从调用中执行匿名PL/SQL块,并且它可以使用bind变量吗?Hi-Lalit。谢谢你的回复。我已经知道我必须使用动态SQL。我的问题是,在执行字符串查询时,我应该如何返回结果集,因为EXECUTE IMMEDIATE不会返回结果集。您需要形成动态字符串,然后将其作为引用光标打开。查看我的更新。