Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.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
Oracle显示动态sql的结果集_Oracle_Plsql - Fatal编程技术网

Oracle显示动态sql的结果集

Oracle显示动态sql的结果集,oracle,plsql,Oracle,Plsql,我是甲骨文的新手,我已经花了两天的时间寻找解决我问题的方法 我有一个视图,它应该有一个动态列和表名。 诸如此类: DECLARE plsql_block VARCHAR2(500); BEGIN plsql_block := 'SELECT CONCAT('some','column') FROM CONCAT('some','table')'; EXECUTE IMMEDIATE plsql_block END; 这会起作用,但如何显示结果?我已经用DBMS.Output和一个

我是甲骨文的新手,我已经花了两天的时间寻找解决我问题的方法

我有一个视图,它应该有一个动态列和表名。 诸如此类:

DECLARE
 plsql_block VARCHAR2(500);
BEGIN
   plsql_block := 'SELECT CONCAT('some','column') FROM CONCAT('some','table')';
   EXECUTE IMMEDIATE plsql_block
END;
这会起作用,但如何显示结果?我已经用DBMS.Output和一个循环尝试过了,但这并不是我想要的。我需要在运行此命令时,将其显示为GUI中的正常结果集。有没有人能告诉我在oracle中是如何做到这一点的

我感谢每一个答案
谢谢pat实际上我不理解你的动态查询。但根据我的理解,这个查询是多行结果集。因此,您需要使用批量收集并通过输出进行迭代,以便显示

有两种方法

1仅显示输出

    SET serveroutput ON;
    DECLARE
      plsql_block VARCHAR2(500);
      lv_col1     VARCHAR2(10):='1';
      lv_col2     VARCHAR2(10):='2';
    type tab_var
    IS
      TABLE OF VARCHAR2(10);
      tab tab_var;
    BEGIN
      plsql_block := 'SELECT CONCAT('||lv_col1||','||lv_col2||') FROM dual';
      EXECUTE immediate plsql_block bulk collect INTO tab;
      FOR i IN tab.first..tab.last
      LOOP
        dbms_output.put_line(tab(i));
      END LOOP;
    END;
2方法是将其重构为一个函数,然后按如下方式使用它

创建表类型

create or replace 
type string_table
IS TABLE OF VARCHAR2(100);

CREATE OR REPLACE
  FUNCTION func_mu
    RETURN string_table
  AS
    plsql_block VARCHAR2(500);
    lv_col1     VARCHAR2(10):='1';
    lv_col2     VARCHAR2(10):='2';
    tab string_table;
  BEGIN
    plsql_block := 'SELECT CONCAT('||lv_col1||','||lv_col2||') FROM dual';
    EXECUTE immediate plsql_block bulk collect INTO tab;
    RETURN tab;
  END;

SELECT * FROM TABLE(func_mu);

如果您使用相应的Oracle客户端安装在Oracle 12c上,则可以执行以下操作:

declare
    l_resultset sys_refcursor;
    l_sql_text varchar2(500) :=q'{select 'Hello, 12c!' as greeting from dual}';
begin
    open l_resultset for l_sql_text;
    dbms_sql.return_result(l_resultset);
end;

未经测试,因为我现在不在12c命令行附近。

将逻辑添加到管道函数中,并在应用程序层中调用它。不清楚要做什么。你能举例说明你的问题会有什么结果吗?第二个解决方案正是我想要的。非常感谢你