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
Sql 是否有可能根据动态打开的ref游标的输出创建视图或表?_Sql_Oracle_Plsql - Fatal编程技术网

Sql 是否有可能根据动态打开的ref游标的输出创建视图或表?

Sql 是否有可能根据动态打开的ref游标的输出创建视图或表?,sql,oracle,plsql,Sql,Oracle,Plsql,我已经学会了如何返回动态打开的ref游标。现在,我想根据输出创建一个表或视图 输入表: create table sales (s_sale_name varchar2(20), s_date_sal date, s_qty number(10) ); 记录 insert into sales values ('Norb','10-MAR-2019',10000); insert into sales values ('Bert','10-MAR-2019

我已经学会了如何返回动态打开的ref游标。现在,我想根据输出创建一个表或视图

输入表:

   create table sales
    (s_sale_name varchar2(20),
    s_date_sal date,
    s_qty number(10)
    );
记录

insert into sales values ('Norb','10-MAR-2019',10000);
insert into sales values ('Bert','10-MAR-2019',5000);
insert into sales values ('Alba','10-MAR-2019',4000);
insert into sales values ('Rob','10-MAR-2019',200000);
insert into sales values ('Norb','11-MAR-2019',5000);
insert into sales values ('Bert','11-MAR-2019',13000);
insert into sales values ('Rob','11-MAR-2019',80000);
insert into sales values ('Norb','12-MAR-2019',1000);
insert into sales values ('Bert','12-MAR-2019',4000);
insert into sales values ('Rob','12-MAR-2019',40000);
insert into sales values ('Alba','12-MAR-2019',2000);
查询输出

sales_name 10-MAR-2019 11-MAR-2019 12-MAR-2019 
Norb             10000        5000        1000
Bert              5000       13000        4000 
Alba              4000           0        2000 
Rob             200000       80000       40000
现在,结果应该保存在表或视图中。到目前为止,我已经学会了如何返回动态打开的ref游标

------这是我使用的程序-----------


这确实是一个很好的问题,也是一个很有挑战性的问题。我不同意
选择创建表的一部分时的@APC点。。。作为SELECT语句。我们绝对不能那样做。我相信Oracle中的每个问题都有一个解决方案

您可以使用
嵌套表
来实现此要求。见下文:

设立:

create  table sales
    (s_sale_name varchar2(20),
    s_date_sal date,
    s_qty number(10)
    );

 /     
insert into sales values ('Norb','10-MAR-2019',10000);
insert into sales values ('Bert','10-MAR-2019',5000);
insert into sales values ('Alba','10-MAR-2019',4000);
insert into sales values ('Rob','10-MAR-2019',200000);
insert into sales values ('Norb','11-MAR-2019',5000);
insert into sales values ('Bert','11-MAR-2019',13000);
insert into sales values ('Rob','11-MAR-2019',80000);
insert into sales values ('Norb','12-MAR-2019',1000);
insert into sales values ('Bert','12-MAR-2019',4000);
insert into sales values ('Rob','12-MAR-2019',40000);
insert into sales values ('Alba','12-MAR-2019',2000);

---Created an Object of Sales table to hold intermediate result
create or replace  type  sales_obj is OBJECT
    (obj_sale_name varchar2(20),
     obj_date_sal date,
     obj_qty number(10)
    );
/
-- Table of Sales Object.
create or replace type vtest1Tab is table of sales_obj;
/
用于创建表的匿名块
ccc

DECLARE 
 VAR VTEST1TAB ; 
 vsql varchar2(500);

BEGIN 

  vsql := 'create table ccc(col1) NESTED TABLE COL1 STORE AS TAB1 
           as 
           Select cast(multiset(Select * from SALES) as VTEST1TAB )
           from dual           
          ';    

  Execute immediate vsql ; 

END;
输出:

SQL> Select p.* 
     from ccc c, 
     table(c.COL1) p ;
在这篇文章中,“Zlatko Sirotic”的回复完全涵盖了如何识别光标的列并打印它们


寻找“dyn_fetch”,因为这个包足够通用,它可以处理任何打印数据的查询。您可以使用相同的方法将数据插入到动态创建的表中。

是否可以将查询结果发布到此输出?我看不出结果有任何对称性。创建视图或表的动态sql依赖于查询的列。Ref游标是PL/sql构造,我们不能在常规sql中使用它们。所以你有一个选择。如果您有一个静态结果集结构,并且始终希望填充同一个表,请使用PL/SQL集合来驱动FORALL insert。但是,如果您想拥有一个可变的ref游标结构(每次都有不同的列)和不同的目标表,那么您需要方法4动态SQL,这是一种非常高级且相当复杂的方法。重新阅读您的问题-这是相当不清楚-但似乎您可能想使用一个参考光标来驱动创建表的选择部分。。。作为SELECT语句。我们绝对不能那样做。也不使用ref光标构建视图。您必须使用动态SQL才能做到这一点。@XIN,谢谢您的解决方案。我已作出相应的更新。请看一看,因为您提供的解决方案应该提供预期的输出。@NorbertWupona。不幸的是,您不能让
立即执行
与语句中的情况相同。不知何故,您只能在下面所示的方法中使用
查询
;我会检查一下,然后回复给你。谢谢
SQL> Select p.* 
     from ccc c, 
     table(c.COL1) p ;